Rails 3.2 から Rails 4.0 へのアップグレード

このページは、Rails Guides の “A Guide for Upgrading Ruby on Rails” の一部を翻訳したものです。

翻訳ミス等もあると思いますので、英語の元サイトも参考にしながらご利用ください。

A Guide for Upgrading Ruby on Rails


この内容はまだ改訂の可能性があります。

もしアプリケーションが Rails 3.2.x より古いバージョンであれば、Rails 4.0 にする前に Rails 3.2 にアップグレードすることをオススメします。

次の変更点は、アプリケーションを Rails 4.0 にアップグレードするためのものです。

2.1 Gemfile

Rails 4.0 では、Gemfile の assets グループはなくなりました。アップグレードする時には、その行を削除する必要があります。

2.2 vendor/plugins

Rails 4.0 は、もう vendor/plugins からロードするプラグインのサポートをしません。プラグインを gem に置き換え、Gemfile に追加しなければならないのです。もし、gem にしないのなら、例えば、lib/my_plugin/* に移し、適当な初期値を config/initializers/my_plugin.rb に追加することもできます。

2.3 Active Record

scope :active, where(active: true)

# becomes
scope :active, -> { where active: true }

2.4 Active Resource

Rails 4.0 は、Active Resource を gem に置き換えました。その機能が必要であれば、Gemfile に Active Resource gem を置けば大丈夫です。

2.5 Active Model

# Disable root element in JSON by default.
# ActiveSupport.on_load(:active_record) do
#   self.include_root_in_json = false
# end

2.6 Action Pack

# config/initializers/secret_token.rb
  Myapp::Application.config.secret_token = 'existing secret token'
  Myapp::Application.config.secret_key_base = 'new secret key base'

ユーザベースが完全に Rails 4.x に移行できて、Rails 3.x に巻き戻さなくてもよいと確信できるまでは、secret_key_base を設定しないように注意してください。これは、Rails 4.x の secret_key_base で署名されたクッキーが、Rails 3.x のものと後方互換性がないためです。他の部分のアップグレードが確実に完了するまでは、所定の位置にある既存の secret_token はそのままにして、新たな secret_key_base は設定せず、廃止警告を無視しておいて構いません。

もし、外部のアプリケーションや Javascript が Rails アプリの署名付きセッションクッキー (もしくは一般的な署名付きクッキー) の読み込めることに依存しているなら、これらの関係を断ち切るまでは、 secret_key_base をセットするべきではありません。

上で述べたように、所定の位置にある secret_token をそのままにして、新たに secret_key_base を追加すると、Rails 3.x で生成された既存の署名付きクッキーは透過的にアップグレードされます。

# config/initializers/secret_token.rb
  Myapp::Application.config.secret_token = 'existing secret token'
  Myapp::Application.config.secret_key_base = 'new secret key base'

ここでも注意が必要です。ユーザベースが完全に Rails 4.x に移行できて、Rails 3.x に巻き戻さなくてもよいと確信できるまでは、secret_key_base を設定しないように注意してください。また、アップグレードする前に、外部のアプリや Javascript があなたのアプリによって生成された署名付きのクッキーをデコード出来ることに依存していないかどうかにも気をつけてください。

暗号化されたセッションクッキーへの移行の詳細は、Pull Request #9978 を読んでください。

get 'one' => 'test#example', as: :example
get 'two' => 'test#example', as: :example
resources :examples
get 'clashing/:id' => 'test#example', as: :example

最初の例では、複数のルートに同じ名前を使わないようにすることで簡単に回避できます。二つ目では、Routing Guide に詳細があるように、resources メソッドの only もしくは except オプションを使って、ルートを制限できます。

get Rack::Utils.escape('こんにちは'), controller: 'welcome', action: 'index'

は、

get 'こんにちは', controller: 'welcome', action: 'index'

のようになります。

# Rails 3.x
match "/" => "root#index"
 
# becomes
match "/" => "root#index", via: :get
 
# or
get "/" => "root#index"

アプリケーションのコードから、ミドルウェアへの参照をすべて削除するのも忘れてはいけません。例:

# 例外があがる
config.middleware.insert_before(Rack::Lock, ActionDispatch::BestStandardsSupport)

また、環境設定を確認して、config.action_dispatch.best_standards_support があれば削除してください。

2.7 Active Support

Rails 4.0 では、ERB::Util#json_escape に対するエイリアス j が削除されました。jActionView::Helpers::JavaScriptHelper#escape_javascript のために使われているからです。

2.8 ヘルパーのロード順

Rails 4.0 では、二つ以上のディレクトリからロードされるヘルパーのロード順が変更されました。以前は、これらは一つにまとめられて、アルファベット順に並べ替えられていました。Rails 4.0 にアップデートすると、ロードされたディレクトリの順序が保持され、各ディレクトリの中でのみアルファベット順に並べ替えられます。helpers_path パラメータを明示的に使用しない限り、この変更はエンジンからヘルパーをロードする方法にのみ影響します。もし、順序に依存しているなら、アップグレード後に正しいメソッドが利用できるかどうかチェックしてください。エンジンがロードされる順序を変更したい場合は、config.railties_order= メソッドが使えます。

2.9 Active Record Observer と Action Controller Sweeper

Active Record Observer と Action Controller Sweeper は、rails-observers gem に置き換えられました。これらの機能が必要なら、rails-observers gem を追加する必要があります。

2.10 sprockets-rails

2.11 sass-rails


This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License

produced by Minami.rb