このページは、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 にアップグレードするためのものです。
Rails 4.0 では、Gemfile の assets グループはなくなりました。アップグレードする時には、その行を削除する必要があります。
Rails 4.0 は、もう vendor/plugins からロードするプラグインのサポートをしません。プラグインを gem に置き換え、Gemfile に追加しなければならないのです。もし、gem にしないのなら、例えば、lib/my_plugin/* に移し、適当な初期値を config/initializers/my_plugin.rb に追加することもできます。
Rails 4.0 では、いくつかの関連づけの矛盾のために、Active Record から “identity map” を削除しました。もし、手入力で “identity map” を有効にしたかったら、次の config を削除すればアプリケーションへの影響がなくなります。config.active_record.identity_map
関連付けされた集合内における delete メソッドは、レコードの id として Fixnum か String で受け取ることができ、それらレコードに加え、destroy メソッドがすることは大抵することができます。以前は、ActiveRecord::AssociationTypeMismatch がその引数(?arguments)を担っていましたが、Rails4.0 からは、自動的な delete が削除を実行する前に、マッチしたレコードの id を探そうとします。
Rails4.0 は、ActiveRecord::Relation に命令を溜め込むような変更をしました。以前のバージョンでは、新しい命令は、その前の命令が明確化された後に適応されていました。しかし、これでは通用しません。詳しくは、Active Record Query guide を参照ください。
Rails4.0 は、serialized_attributes と attr_readonly をクラスメソッドに限定する変更をしました。インスタンスメソッドは廃止する予定ですので使わずにクラスメソッドに変更してください。例:self.serialized_attributes -> self.class.serialized_attributes
Rails4.0 は、Strong Parameters を利用する特徴として、attr_accessible と attr_protected を削除しました。スムーズなアップグレードの道筋として、Protected Attributes gem を使うといいでしょう。
Rails4.0 は、scope を Proc や lambda のような呼び出し可能なオプジェクトにすることをお勧めします。
scope :active, where(active: true)
# becomes
scope :active, -> { where active: true }Rails4.0 は、ActiveRecord::FixtureSet を利用して、ActiveRecord::Fixtures を廃止予定です。
Rails4.0 は、ActiveSupport::TestCase を利用して、ActiveRecord::TestCase を廃止予定です。
Rails 4.0 は、Active Resource を gem に置き換えました。その機能が必要であれば、Gemfile に Active Resource gem を置けば大丈夫です。
Rails 4.0 は、エラーと ActiveModel::Validations::ConfirmationValidator との連携方法を変更しました。confirmation validations がコケたとき、エラーは attribute の代わりに :#{attribute}_confirmation と連携されます。
Rails 4.0 は、ActiveModel::Serializers::JSON.include_root_in_json の初期値を false に変更しました。Active Model Serializers と Active Record objects は、同じデフォルトの挙動になります。これで、config/initializers/wrap_parameters.rb ファイルの次のオプションを、コメントアウトしたり削除したりすることができます。
# Disable root element in JSON by default.
# ActiveSupport.on_load(:active_record) do
# self.include_root_in_json = false
# endActiveSupport::KeyGenerator が導入され、(特に) 署名付きクッキーの生成や検証の基盤として利用します。所定の位置にある 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 を設定しないように注意してください。これは、Rails 4.x の secret_key_base で署名されたクッキーが、Rails 3.x のものと後方互換性がないためです。他の部分のアップグレードが確実に完了するまでは、所定の位置にある既存の secret_token はそのままにして、新たな secret_key_base は設定せず、廃止警告を無視しておいて構いません。
もし、外部のアプリケーションや Javascript が Rails アプリの署名付きセッションクッキー (もしくは一般的な署名付きクッキー) の読み込めることに依存しているなら、これらの関係を断ち切るまでは、 secret_key_base をセットするべきではありません。
secret_key_base がセットされていると、クッキーベースのセッションの内容を暗号化します。Rails 3.x では、クッキーベースのセッションの内容は署名されていますが、暗号化はされていません。署名付きのクッキーは、あなたのアプリによって生成されたことが検証でき、改竄を防止できるので「安全」です。しかし、その内容はエンドユーザにも見えてしまい、内容を暗号化することは、大きなパフォーマンスのロスなしに、この危険や懸念を排除することが出来ます。上で述べたように、所定の位置にある 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 を読んでください。
Rails 4.0 では、ActionController::Base.asset_path オプションは削除されました。Asset Pipeline 機構を使ってください。
Rails 4.0 では、ActionController::Base.page_cache_extension オプションは非推奨になりました。代わりに ActionController::Base.default_static_extension を使ってください。
Rails 4.0 では、ActionPack から Action と Page のキャッシュが削除されました。コントローラで、caches_action を使うには actionpack-action_caching gem を、caches_pages を使うには actionpack-page_caching gem 追加する必要があります。
Rails 4.0 では、XML のパラメータパーサーが削除されました。もしこの機能が必要なら、actionpack-xml_parser gem を追加する必要があります。
Rails 4.0 では、memcached クライアントのデフォルトが、memcache-client から dalli に変更されました。アップグレードするには、Gemfile に gem 'dalli' の行を追加するだけです。
Rails 4.0 では、dom_id および dom_class メソッドが非推奨になりました。この機能が必要なら、コントローラで ActionView::RecordIdentifier モジュールをインクルードする必要があります。
Rails 4.0 では、assert_generates、assert_recognizes、assert_routing の挙動が変更されました。これらのアサーションは、ActionController::RoutingError 例外ではなく、Assertion 例外をあげるようになっています。
Rails 4.0 では、相反する名前付きルートが定義されたときに、ArgumentError があがるようになりました。これは、名前付きルートが明示的に定義されるか、resources メソッドで起こります。ここでは、example_path という名前のルートが相反するサンプルを二つあげています。
get 'one' => 'test#example', as: :example
get 'two' => 'test#example', as: :exampleresources :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'のようになります。
match を使ったルートでは、リクエストメソッドを指定する必要があります。例えば、# Rails 3.x
match "/" => "root#index"
# becomes
match "/" => "root#index", via: :get
# or
get "/" => "root#index"Rails 4.0 has removed ActionDispatch::BestStandardsSupport middleware, <!DOCTYPE html> already triggers standards mode per http://msdn.microsoft.com/en-us/library/jj676915(v=vs.85).aspx and ChromeFrame header has been moved to config.action_dispatch.default_headers.
Rails 4.0 では、ActionDispatch::BestStandardsSupport ミドルウェアが削除され、http://msdn.microsoft.com/en-us/library/jj676915(v=vs.85).aspx によると <!DOCTYPE html> が記述されているだけで標準モードになるので、ChromeFrame 用のヘッダは config.action_dispatch.default_headers に移動されました。
アプリケーションのコードから、ミドルウェアへの参照をすべて削除するのも忘れてはいけません。例:
# 例外があがる
config.middleware.insert_before(Rack::Lock, ActionDispatch::BestStandardsSupport)また、環境設定を確認して、config.action_dispatch.best_standards_support があれば削除してください。
Rails 4.0 では、asset プリコンパイルで vendor/assets や lib/assets から JS/CSS 以外の asset を自動ではコピーしません。Rails アプリケーションやエンジンの開発者は、これらを app/assets に置くか、config.assets.precompile を設定する必要があります。
Rails 4.0 では、アクションが要求されたフォーマットを処理できない場合に ActionController::UnknownFormat 例外をあげます。デフォルトでは、この例外は 406 Not Acceptable を返すよう処理されますが、これは変更可能になりました。Rails 3 では常に 406 Not Acceptable が返され、変更出来ませんでした。
Rails 4.0 では、ParamsParser がリクエストパラメータのパースに失敗した場合に、ActionDispatch::ParamsParser::ParseError を継承した例外があがります。より下位の、例えば MultiJson::DecodeError の代わりに、この例外を rescue してもよいです。
Rails 4.0 では、エンジンが URL プレフィックス付きのアプリケーションにマウントされている場合でも、SCRIPT_NAME は正しくネストされます。URL プレフィックスの上書きに対処するために、default_url_options[:script_name] をセットする必要はなくなりました。
Rails 4.0 では、ActionController::Integration は非推奨になりました。ActionDispatch::Integration を使ってください。
Rails 4.0 では、ActionController::IntegrationTest は非推奨になりました。ActionDispatch::IntegrationTest を使ってください。
Rails 4.0 では、ActionController::PerformanceTest は非推奨になりました。ActionDispatch::PerformanceTest を使ってください。
Rails 4.0 では、ActionController::AbstractRequest は非推奨になりました。ActionDispatch::Request を使ってください。
Rails 4.0 では、ActionController::Request は非推奨になりました。ActionDispatch::Request を使ってください。
Rails 4.0 では、ActionController::AbstractResponse は非推奨になりました。ActionDispatch::Response を使ってください。
Rails 4.0 では、ActionController::Response は非推奨になりました。ActionDispatch::Response を使ってください。
Rails 4.0 では、ActionController::Routing は非推奨になりました。ActionDispatch::Routing を使ってください。
Rails 4.0 では、ERB::Util#json_escape に対するエイリアス j が削除されました。j は ActionView::Helpers::JavaScriptHelper#escape_javascript のために使われているからです。
Rails 4.0 では、二つ以上のディレクトリからロードされるヘルパーのロード順が変更されました。以前は、これらは一つにまとめられて、アルファベット順に並べ替えられていました。Rails 4.0 にアップデートすると、ロードされたディレクトリの順序が保持され、各ディレクトリの中でのみアルファベット順に並べ替えられます。helpers_path パラメータを明示的に使用しない限り、この変更はエンジンからヘルパーをロードする方法にのみ影響します。もし、順序に依存しているなら、アップグレード後に正しいメソッドが利用できるかどうかチェックしてください。エンジンがロードされる順序を変更したい場合は、config.railties_order= メソッドが使えます。
Active Record Observer と Action Controller Sweeper は、rails-observers gem に置き換えられました。これらの機能が必要なら、rails-observers gem を追加する必要があります。
assets:precompile:primary は削除されました。代わりに、assets:precompile を使ってください。asset_url は非推奨になりました。例えば、asset-url("rails.png", image) は asset-url("rails.png") になります。This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License
produced by Minami.rb