Rails2系 => Rails3.0系移行、実践的まとめ

rails3.1系になるとまた大きく変わりそうだけど(特にJavaScript周り)、一旦まとめておこう。

routes.rb

/:controller/:action/:id

はroutes.rbに記述されなくなった。RESTを使え。

代わりに以下のコメントを外すとレガシーなものも使える。

match ':controller(/:action(/:id(.:format)))'

routes.rbの記述形式は他にもいろいろ異なる。
Rails Routing from the Outside In — Ruby on Rails Guides

find周り

Arelを使うならfind(:all, ...)系は基本的に使わない。
すべてwhere(...)やallを使った方がいい。

ただし、find(1) や find_by_name('hoge') みたいなものは今後も消えないだろうから使っといていい。

<%= %> => <% %>

form_forなどの指定は<% %>から<%= %>に変わっている。<% %> は「Rubyスクリプト片をその場で実行」。<%= %> は「式を評価した結果をその場に挿入」。
form_forは「結果がその場に挿入される」ので、 <%= %> を使うということ(たぶん)。
fields_forとかも一緒。

error_messages_for

error_message, error_messages_for は無くなっている。
理由は「やってたることは簡単なのに、変更はやりづらいし、黒魔術っぽいから削除した」ってDHHが書いている。
We removed error_messsages_for because it wrapped up something really simple (it... | Hacker News

errors.on

モデルのerrors.onは非推奨になった。代わりにerrors[属性名].firstを使う。

validates_xx

validates_presence_ofなどの代わりにvalidatesを使うとナウい

validates_presence_of :hoge, :message => 'の入力は必須です。'

上記は以下のように書き直せる。

validates :hoge, :presence => {:message => 'の入力は必須です。'}

stylesheet_link_tag :all

stylesheet_link_tag :all が使えるようになった。
public/stylesheets以下のスタイルを全部読み込むというもの。

h()

<%= %> はデフォルトでh()が呼ばれるようになった。
HTMLをエスケープしたくない場合はraw()を使う。

<%= raw "aa" %>

link_to_remote, form_remote_for

xxx_remote系のメソッドはなくなった。
代わりにオプションで:remote => trueを指定する。

さらに、xxx_remote系のメソッドであった :before, :complete のオプションが使えない。
その代わりJavaScriptでイベントを追加する。
prototype.jsだと以下のようにする。

    <%= link_to "削除",
        hoge_path(hoge),
        :method => :delete,
        :remote => true,
        :confirm => "本当に削除しますか?",
        :id => "destroy_hoge_#{hoge.id}" %>
    <%= javascript_tag do %>
      document.on("ajax:before", "#destroy_hoge_<%= comment.id %>",
        function(event, element){
          alert('before');
      });
      document.on("ajax:complete", "#destroy_hoge_<%= comment.id %>",
        function(event, element){
          alert('complete');
      });
    <% end %>

ただし、IEだと以下の問題がある(rails3.0.7)。
Rails3.0.4で、link_to ヘルパーメソッドにconfirmやmethodを混ぜるときの注意

edgeだと直っているがなぜかrails3.0系に反映されないという。
#6747 Why didn't fixes backport to rails.js in rails3.0 stable? - Ruby on Rails - rails

config.serve_static_assets

設定で気をつけるのはconfig.serve_static_assets。
Rails 3.0 の production モードでは静的ファイルが自動ロードされない - happy lie, happy life

コマンド周り

いろいろと変わってる。

推測しずらいのは以下辺りかな。

  • script/performance/benchmarker => rails benchmarker
  • script/performance/profiler => rails profiler

flash[:notice]

noticeがナウい

pagination

Will_paginateよりa_matsudaさんのKaminariがナウい
ただ、KaminariはHTML5を吐くところがあるのでIEでの取扱いがやや面倒。

画像アップロード

attachment_fuよりpaperclipがナウい
attachment_fuはたぶんrails3対応していないはず。

ログイン・ログアウト

restful_authenticationはrails3未対応。
代わりにdeviseを使う。
deivseはライブラリでかすぎて嫌い。
# たぶん、今後シンプル路線の認証ライブラリが出てきそげ。