Rails 3.0 ist fertig

Nach knapp zwei Jahren Entwicklung, ca. 1600 Beteiligten und tausenden Commits ist Gestern endlich die dritte Railsversion veröffentlicht worden. Wie wir euch bereits in anderen Artikeln geschrieben hatten, bringt diese Version einige Neuerungen und Erweiterungen mit.

Hier nochmal eine Zusammenfassung der Neuerungen für euch:

Die neue Active Record query engine:
Active Record basiert nun auf ARel um die Datenbank-Abfragen noch weiter zu verfeinfachen und zu den Zugriff zu optimieren.

Neuer router für Action Controller:
Auch in dieser Version wurde das Routing angepasst um es flexibler zu machen.

Neuer Action Mailer
Action Mailer war bisher eine Mischung aus Controller und Model und die Verwendung stark Erklärungbedürftig. Das Rails-Team hat nun entschieden Action Mailer wie Controller aufzubauen, da die Funktionen sich diesen mehr überschneiden.

Verwalten der Abhängigkeiten mit bundler
Mit bundler können nun auf einfache Weise Abhängigkeiten einer Rails-Applikation gelöst bzw. verwaltet werden.

XSS Schutz per default
Um die Sicherheit weiter zu erhöhen wurde, ist in Rails 3 XSS Protection standardmäßig eingeschaltet.

Encoding
Viele sind sicherlich über das folgende Zeichen gestossen: „�“ Mit Rails 3 in Kombination mit Ruby 1.9 sollte dieses Problem endlich der Vergangheit anghören.

Active Model: Validierung, callbacks, etc für alle Models
Häufig benutzte Teile von Active Model sind nun in Active Model Framework ausgelagert worden um z.B. auch anderen ORMs die Möglichkeit zu bieten, auf die Standardfuntionen wie Validations zurückgreifen zu können.

Offizielle Plugin API
Durch die offzielle Plugin-API ist nun für Entwickler möglich einfacher und tiefer Integrierte Plugins zu schreiben.

Dokumentation
Die Dokumentation wurde stark überarbeitet und zeitgleich erweitert. Zusätzlich erscheinen in Kürze aktualisierte und neue Bücher zu Rails 3.

Installation
Die Installation kann wie gewohnt über gems vorgenommen werden:

[bash]
gem install rails –version 3.0.0.
[/bash]

Weitere Infos
Weiter Details gibt es im Blogeintrag von David und natürlich in den Changelogs:
http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+RidingRails+%28Riding+Rails%29

Screencast: Polling nach Aktualisierungen

Bei häufig aktualisierten Daten auf der Serverseite, ist es hilfreich diese dem Benutzer automatisch anzuzeigen. In diesem Screencast zeigt Ryan wie dies mit JQuery gelöst werden kann.

 

Download:

Download(23.2 MB, 16:07)
Alternativer Download für iPod & Apple TV(22.3 MB, 16:07)

 

Resourcen:

 

Quellcode:

[bash]
bundle install
rails g jquery:install
[/bash]

[ruby]
# Gemfile
gem ‚jquery-rails‘

# comments_controller.rb
def index
@comments = Comment.where("article_id = ? and created_at > ?", params[:article_id], Time.at(params[:after].to_i + 1))
end
[/ruby]

[html]
<!– layouts/application.html.erb –>
<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>

<!– articles/show.html.erb –>
<div id="article" data-id="<%= @article.id %>">

<div class="comment" data-time="<%= comment.created_at.to_i %>">

<!– comments/index.js.erb –>
<% unless @comments.empty? %>
$("#comments").append("<%=raw escape_javascript(render(@comments)) %>");
$("#article h2").text($(".comment").length + " comments");
<% end %>
[/html]

Screencast: Sortierbare Tabellen

Ryan zeigt in diesem Screencast wie Tabellen auf- und absteigend sortiert werden können.

 

Download:

Download(16.2 MB, 10:52)
Alternativer Download für iPod & Apple TV(15.4 MB, 10:52)

 

Resourcen:

 

Quellcode:

[ruby]
class ProductsController < ApplicationController
helper_method :sort_column, :sort_direction

def index
@products = Product.order(sort_column + " " + sort_direction)
end

# …

private

def sort_column
Product.column_names.include?(params[:sort]) ? params[:sort] : "name"
end

def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
end

# application_helper.rb
def sortable(column, title = nil)
title ||= column.titleize
css_class = column == sort_column ? "current #{sort_direction}" : nil
direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc"
link_to title, {:sort => column, :direction => direction}, {:class => css_class}
end
[/ruby]

[html]
<!– products/index.html.erb –>
<tr>
<th><%= sortable "name" %></th>
<th><%= sortable "price" %></th>
<th><%= sortable "released_at", "Released" %></th>
</tr>
[/html]

[css]
/* application.css */
.pretty th .current {
padding-right: 12px;
background-repeat: no-repeat;
background-position: right center;
}

.pretty th .asc {
background-image: url(/images/up_arrow.gif);
}

.pretty th .desc {
background-image: url(/images/down_arrow.gif);
}
[/css]

Subversion und .svn Verzeichnisse finden und löschen

Subversion, häufig abgekürzt SVN gennant, ist eine Quellcode-Versionierungssoftware und hat vor ein paar Jahren das bis dahin etablierte CVS (Concurrent Version System) an vielen Stellen abgelöst. Auch wenn GIT nun an vielen Stellen SVN ablöst, ist die Software noch in vielen Betrieben erfolgreich im Einsatz. Nicht zuletzt, weil es eine weite Unterstützung in Form von Plugins in IDEs, GUIs und Tools gibt.
Ein mit SVN versioniertes Software-Projekt erkennt man häufig an der Verzeichnisstruktur. Solange der Quellcode noch versioniert wird, befinden sich .svn Verzeichnisse in allen Projekt-Ordnern und das Repository, das die zentrale „Ablage-Stelle“ auf einem Server darstellt, ist in der Regel nach einem bestimmten Muster aufgebaut.

Viele folgen der Empfehlung das zentrale SVN-Repository/Archiv mit Unterverzeichnisse zu strukturieren, die den jeweiligen Software-Status widerspiegeln. „trunk“ für die aktuelle Entwicklung, „stable“ für den stabilen Stand, „branches“ und „tags“ für unabhängige Entwicklungslinien mit der gleichen Historie. Die letztgenannten fließen häufig in den Hauptzweig zurück.

 

Für jede Datei in einem Projekt merkt sich Subversion zwei essentielle Informationen in einem eigenen Verwaltungsbereich. Dieser Bereich sind die .svn-Verzeichnisse die in jedem Projekt-Order zu finden sind. Dort merkt sich SVN auf welcher Revision die Arbeitsdateien aufbauen und den Zeitstempel der letzten Aktualisierung.

 

Die .svn-Verzeichnisse werden nur während der Entwicklung benötigt und sind auf produktiven System eher unerwünscht. Subversion ermöglicht durch den Unterbefehl „export“ eine unversionierte Version eines Projekts zu erstellen. Die exportierte Version ist frei von den subversion-spezifischen Dateien und Verwaltungsbereichen. Dennoch kommt es hin und wieder vor, dass man in einer lokalen Kopie (auf dem eigenen Rechner oder auf dem Server) die .svn löschen möchte, weil zum Beispiel gerade in diesem Augenblick nicht die Möglichkeit besteht einen Export zu generieren.

 

Die folgende Bash-Scriptzeile kann benutzt werden, um alle .svn-Vezeichnisse und Dateien die mit „._“ beginnen zu finden und zu löschen.

[bash]
find . -name ".svn" -prune -o -name "._*" -exec rm -rf {} ;
[/bash]

Windows-Benutzer können die Script-Zeile in einer Cygwin-Shell verwenden.

 

Typische SVN-Kommandos die täglich eingesetzt werden:

[bash]
#———————————————————————-
# Eine lokale Kopie eines Projektes aus dem zentralen Archiv erstellen
#———————————————————————-
svn checkout svn://example.com/svn/trunk # über das svn-Protokoll
svn checkout https://example.com/svn/trunk # über HTTP

#———————————————————————-
# Basis-Befehle
#———————————————————————-
svn up # Kurzform für "svn update"; Aktualisiert die lokale
# Version auf den Stand des zentralen Repository
svn add [Datei] # Fügt eine Datei zu dem Projekt hinzu
svn ci -m "Nachricht" # Kurzform für ’svn commit -m "Nachricht"‘;
# Überträgt die eigenen Änderungen in das
# zentrale Repository
svn log # Zeigt die Historie eines Projektes

#———————————————————————-
# Arbeiten mit Verzeichnissen und Dateien
#———————————————————————-
svn copy Datei-A Datei-B # Erstellt eine Kopie von "Datei-A" unter
# dem Namen "Datei-B" und nimmt diese
# in die Versionierung auf
svn mkdir MeinNeuesVerzeichnis # Erstellt ein Verzeichnis mit dem Namen
# "MeinNeuesVerzeichnis" und nimmt es in
# die Versionierung auf
svn mv Datei-A Datei-B # Benennt eine Datei mit dem Namen
# "Datei-A" nach "Datei-B" um. Die Historie
# bleibt dabei erhalten
svn rm Datei-A # Löscht "Datei-A" und nimmt diese aus der
# Versionierung raus

#———————————————————————-
# Verschiedenes/Nützliches
#———————————————————————-
svn status # Zeigt den Status (Veränderugen) der lokalen Version an.
svn diff # Zeigt den Unterschiede im Unix-Diff-Format an.
# Die Ausgabe kann in eine Datei umgeleitet
# werden, um einen Patch zu erstellen
svn revert # Verwirft die eigenen und noch nicht übergebenen Änderungen.
# Dabei wird die lokale Version auf die letztbekannte
# Version gebracht
svn info # Zeigt allgemeine Informationen zu einem Projekt
[/bash]

Subversion bringt weit mehr Befehle mit, um die volle Kontrolle über die Versionierung zu behalten, aber dies würde den Rahmen dieses Artikels sprengen. Weiterhin kapseln Werkzeuge wie Tortoise-SVN diese Befehle und Funktionen in einer GUI, um die Arbeit zu vereinfachen. Dennoch ist es sinnvoll mit den direkten Befehlen umgehen zu können, falls eine GUI nicht zur Verfügung steht.
Interessierte, die mehr über Subversion und dessen Möglichkeiten erfahren wollen, finden in folgenden Büchern alles Wissenswerte über dieses Tool.

 

Dieses Buch ist auch in einer freien digitalen Version unter folgender Adresse erhältlich: http://svnbook.red-bean.com/

 

Screencast: Upgrade auf Rails 3 Teil 3

Im dritten und letzten Teil der Rails-3-Upgrade Serie zeigt Ryan wie Warnungen über veraltetete Funktionen und Probleme in der View gelöst werden.

 

Download:

Download(19.6 MB, 9:34)
Alternativer Download für iPod & Apple TV(17.3 MB, 9:34)

 

Resourcen:

 

Quellcode:

[bash]
rake spec
rails plugin install git://github.com/rails/dynamic_form.git
bundle install
rm public/index.html
rm public/images/rail.png
ls script
rm script/server
[/bash]

[ruby]
gem "thinking-sphinx", :require => ‚thinking_sphinx‘, :git => "git://github.com/freelancing-god/thinking-sphinx.git", :branch => "rails3"

# helpers
def textilize(text)
Textilizer.new(text).to_html.html_safe unless text.blank?
end

def title(page_title, show_title = true)
content_for(:title, page_title.to_s)
@show_title = show_title
end
[/ruby]

[html]
<!– layouts/application.html.erb –>
<%= javascript_include_tag ‚jquery‘, ‚rails‘, ‚application‘ %>
<%= csrf_meta_tag %>

<%= content_for?(:side) ? yield(:side) : render(:partial => ’shared/side‘) %>
[/html]

Screencast: Upgrade auf Rails 3 Teil 2

In dieser Woche zeigt Ryan, im zweiten Teil seiner Serie bzgl. Upgrade auf Rails 3, wie RSpec hinzugefügt bzw. aktualisiert werden kann und geht nochmal auf das rails_upgrade Plugin ein.

 

Download:

Download(40.2 MB, 12:23)
Alternativer Download für iPod & Apple TV(28.6 MB, 12:23)

 

Resourcen:

 

Quellcode:

[bash]
bundle install
rails g rspec:install
rake rails:upgrade:check
rake spec
rails plugin remove rails_upgrade_check
[/bash]

[ruby]
# Gemfile
gem "will_paginate", ">= 3.0.pre2"
group :development, :test do
gem "mocha"
gem "rspec-rails", ">= 2.0.0.beta.19"
gem "factory_girl_rails"
end

# config/application.rb
require ‚yaml‘
APP_CONFIG = YAML.load(File.read(File.expand_path(‚../app_config.yml‘, __FILE__)))
# …
config.autoload_paths += %W(#{Rails.root}/lib)

# models/comment.rb
scope :recent, order("created_at DESC")

# spec_helper.rb
config.include ControllerMacros

# specs
render_view
response.should have_selector(‚title‘, :content => ‚Railscasts Comments‘)

# config/routes.rb
Railscasts::Application.routes.draw do
root :to => "episodes#index"

match "about" => "info#about", :as => "about"
match "contest" => "info#contest", :as => "contest"
match "feeds" => "info#feeds", :as => "feeds"
match "give_back" => "info#give_back", :as => "give_back"
match "login" => "sessions#new", :as => "login"
match "logout" => "sessions#destroy", :as => "logout"

resources :sponsors
resources :comments
resources :tags
resources :episodes do
collection do
get :archive
end
end
resources :sessions
resources :spam_questions
resources :spam_checks
resources :spam_reports do
member do
post :confirm
end
collection do
post :confirm
end
end
end
[/ruby]

Screencast: Upgrade auf Rails 3 Teil 1

Spätestens nachdem nun der erste Release Kandidat für Rails 3 verfügbar ist, sollten die bestehenden Applikationen auf ihre Kompatibilität zur neuen Version geprüft werden.
In einer mehrteiligen Serie wird Ryan zeigen, auf was man achten muss und wie ein Upgrade erfolgen kann. Im ersten Teil wird eine App mit dem Rails 3 RC aufgesetzt und mit dem rails_upgrade Plugin werden die benötigten Updates ermittelt.

 

Download:

Download(35.3 MB, 11:56)
Alternativer Download für iPod & Apple TV(28.2 MB, 11:56)

 

Resourcen:

 

Quellcode:

[bash]
rvm update
rvm reload
rvm install 1.9.2
gem install rails –pre
rvm system
script/plugin install git://github.com/rails/rails_upgrade.git
rails -v
rake rails:upgrade:check
rake rails:upgrade:backup
rvm 1.9.2
rails new . -d mysql
bundle install
rails s
[/bash]

[ruby]
# config/application.rb
class Object
def returning(value)
yield(value)
value
end
end
# …
config.time_zone = ‚Pacific Time (US & Canada)‘

# Gemfile
gem "RedCloth", ">= 4.0", :require => ‚redcloth‘
gem "coderay"
gem "acts_as_list"
gem "will_paginate"
gem "thinking-sphinx", ">= 2.0.0.rc1", :require => ‚thinking_sphinx‘
gem "whenever", :require => false
[/ruby]