1 Rails 4.0へのアップグレード
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 3.2までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 4.0にアップデートしてください。アップグレードの注意点などについてはRuby on Railsアップグレードガイド を参照してください。
2 Rails 4.0アプリケーションを作成する
# 'rails'というRubyGemがインストールされている必要があります。 $ rails new myapp $ cd myapp
2.1 gemに移行する
Railsでは、アプリケーションのルートディレクトリに置かれるGemfile
を使って、アプリケーションの起動に必要なgemを指定します。このGemfile
はBundlerというgemによって処理され、依存関係のある必要なgemをすべてインストールします。依存するgemをそのアプリケーションの中にだけインストールして、OS環境にある既存のgemに影響を与えないようにすることもできます。
詳細情報: Bundlerホームページ
2.2 最新のgemを使用する
Bundler
とGemfile
のおかげで、専用のbundle
コマンド一発でRailsアプリケーションのgemを簡単に安定させることができます。Gitリポジトリから直接bundleしたい場合は--edge
フラグを追加します。
$ rails new myapp --edge
Railsアプリケーションのリポジトリをローカルにチェックアウトしたものがあり、それを使用してアプリケーションを生成したい場合は、--dev
フラグを追加します。
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 主要な変更
3.1 アップグレード
- Ruby 1.9.3 (コミット) - Ruby 2.0を推奨、1.9.3以降は必須。
- 今後の非推奨化ポリシー - 非推奨となった機能はRails 4.0で警告が表示されるようになり、Rails 4.1ではその機能が完全に削除される。
- ActionPackの「ページとアクションキャッシュ」(page and action caching) (コミット) - ページとアクションキャッシュは個別のgemに分離された。ページとアクションキャッシュは手動での調整が必要な部分が多すぎる(背後のモデルオブジェクトが更新されたらキャッシュを手動で期限切れにする必要がある)。今後はロシアンドールキャッシュを使用のこと。
- ActiveRecord observers (コミット) - observers (デザインパターン) は個別のgemに分離された。observersパターンはページとアクションキャッシュでしか使用されず、コードがスパゲッティになりやすいため。
- ActiveRecordセッションストア (コミット) - ActiveRecordセッションストアは個別のgemに分離された。セッションをSQLに保存するのはコストがかさむ傾向がある。今後はcookiesセッション、memcacheセッション、または独自のセッションストアを使用のこと。
- ActiveModelマスアサインメント保護 (コミット) - Rails 3のマスアサインメント保護は非推奨に指定された。今後はStrong Parametersを使用のこと。
- ActiveResource (コミット) - ActiveResourceは個別のgemに分離された。ActiveResourceの使用頻度が低いため。
- vendor/plugins の削除 (コミット) - 今後はGemfileでgemのインストールを管理すること。
3.2 ActionPack
-
Strong Parameters (コミット) - ホワイトリストで明示的に許可されたパラメータ (
params.permit(:title, :text)
) を使用しないとモデルオブジェクトを更新できないようにする。 -
ルーティングの「concern」機能 (コミット) - ルーティング用のDSLで、共通となるサブルーティング (subroutes) を除外する (
/posts/1/comments
と/videos/1/comments
におけるcomments
など)。 -
ActionController::Live (コミット) - JSONを
response.stream
でストリーミングする。 - 「宣言的 (declarative)」ETag (コミット) - コントローラレベルのetagを追加する。これはアクションでのetag算出にも使われる。
- ロシアンドールキャッシュ (コミット) - ビューで、ネストしたコード断片をキャッシュする。各断片は依存関係のセット (キャッシュキー) に応じて期限切れになる。通常、このキャッシュキーにはテンプレートのバージョン番号とモデルオブジェクトが使われる。
- Turbolinks (コミット) - 最初のHTMLページだけを使ってサービスを提供する (訳注: 一部しか違わないページのためにページ全体を HTTP 送信しないで済むようにするための仕組み)。ユーザーが別のページに遷移すると、pushStateでURLを差し替え、AJAXでタイトルとbodyを差し替える。
- ActionControllerとActionViewの分離 (コミット) - ActionViewはActionPackから分離され、Rails 4.1で個別のgemに移行する予定。
- ActiveModelへの依存をただちにやめること (コミット) - ActionPackはもはやActiveModelを使用しなくなった。
3.3 一般
-
ActiveModel::Model (commit) -
ActiveModel::Model
は通常のRubyオブジェクトでもActionPackの機能を利用できるようにする (form_for
など) ためのミックスイン。 - 新しい「スコープAPI」 (コミット) - scopeメソッドの引数は常にcallメソッドを実装していなくてはならない。
- スキーマキャッシュダンプ (コミット) - Railsの起動時間短縮のため、スキーマをデータベースから直接読み込むのではなくダンプファイルから読み込む。
- トランザクション分離レベル指定のサポート (コミット) - 読み出しを頻繁に行うか、書き込みのパフォーマンスを重視してロックを減らすかを選択できる。
- Dalli (コミット) - memcacheストアにはDalliのmemcacheクライアントを使用すること。
- 通知の開始と終了 (コミット) - Active Support の内部フック機構 (instrumentation) によってサブスクライバへの通知の開始と終了が報告されます。
- デフォルトでのスレッドセーフ提供 (コミット) - Railsは追加設定なしでスレッド化されます。
追加したgemも同様にスレッドセーフであるかどうかをチェックしておいてください。
- PATCH動詞 (コミット) - 従来の HTTP動詞であるPUTはPATCHに置き換えられました。PATCHはリソースの部分的な更新に使われます。
3.4 セキュリティ
- matchだけですべてをまかなわないこと (コミット) - ルーティング用のDSLで match を使用する場合には HTTP 動詞 (verb) を明示的にひとつまたは複数指定する必要があります。
-
htmlエンティティをデフォルトでエスケープ (コミット) - ERB内でレンダリングされる文字列は、
raw
やhtml_safe
メソッドでラップしない限り常にエスケープされます。 -
新しいセキュリティヘッダー (コメント) - Railsから送信されるあらゆるHTTPリクエストに次のヘッダーが含まれるようになりました:
X-Frame-Options
(クリックジャック防止のため、フレーム内へのページ埋め込みを禁止するようブラウザに指示する)、X-XSS-Protection
(スクリプト注入を停止するようブラウザに指示する)、X-Content-Type-Options
(jpegファイルをexeとして開かないようブラウザに指示する)。
4 外部gem化された機能
Rails 4.0では多くの機能が切り出されてgemに移行しました。切り出されたgemをGemfile
ファイルに追加するだけでこれまでと同様に利用できます。
- ハッシュベースおよび動的findメソッド群 (GitHub)
- Active Recordモデルでのマスアサインメント保護 (GitHub、Pull Request)
- ActiveRecord::SessionStore (GitHub、Pull Request)
- Active Record Observerパターン (GitHub、Commit)
- Active Resource (GitHub, Pull Request、ブログ記事)
- アクションキャッシュ (GitHub、Pull Request)
- ページキャッシュ (GitHub、Pull Request)
- Sprockets (GitHub)
- パフォーマンステスト (GitHub、Pull Request)
5 ドキュメント
ガイドはGitHub風マークダウンで書き直されました。
ガイドのデザインがレスポンシブになりました。
6 Railties
変更の詳細についてはChangelog を参照してください。
6.1 主な変更点
テスト用ディレクトリが追加されました:
test/models
、test/helpers
、test/controllers
、test/mailers
これらに対応するrakeタスクも追加されました。(Pull Request)アプリケーション内の実行ファイルは
bin/
ディレクトリに置かれるようになりました。rake rails:update:bin
を実行するとbin/bundle
、bin/rails
、bin/rake
を取得します。デフォルトでスレッドセーフになりました。
rails new
に--builder
または-b
を渡すことでカスタムビルダーを使用できる機能は削除されました。今後はアプリケーションテンプレートの利用をご検討ください。(Pull Request)
6.2 非推奨
config.threadsafe!
は非推奨になりました。今後はconfig.eager_load
をご利用ください。後者は一括読み込み (eager load) の対象をさらに細かい粒度で制御できます。Rails::Plugin
は廃止されました。今後はvendor/plugins
にプラグインを追加する代わりに、gemやbundlerでパスやgit依存関係を指定してご利用ください。
7 Action Mailer
変更の詳細についてはChangelog を参照してください。
7.1 主な変更点
7.2 非推奨
8 Active Model
変更の詳細についてはChangelog を参照してください。
8.1 主な変更点
ActiveModel::ForbiddenAttributesProtection
を追加しました。許可されていない属性が渡された場合にマスアサインメントから属性を保護するためのシンプルなモジュールです。ActiveModel::Model
を追加しました。RubyオブジェクトをAction Packですぐに使えるようにするためのミックスインです。
8.2 非推奨
9 Active Support
変更の詳細についてはChangelog を参照してください。
9.1 主な変更点
非推奨の
memcache-client
gemをActiveSupport::Cache::MemCacheStore
のdalli
に置き換えました。ActiveSupport::Cache::Entry
が最適化され、メモリ使用量と処理のオーバーヘッドが軽減されました。語の活用形 (inflection) をロケールごとに設定できるようになり、
singularize
やpluralize
メソッドの引数にロケールも指定できるようになりました。Object#try
に渡したオブジェクトにメソッドが実装されていなかった場合に、NoMethodErrorエラーを発生する代わりにnilを返すようになりました。新しいObject#try!
を使用すれば従来と同じ動作になります。String#to_date
に無効な日付を渡した場合に発生するエラーがNoMethodError: undefined method 'div' for nil:NilClass
からArgumentError: invalid date
に変更されました。これによってDate.parse
と同じ動作になり、以下のように3.xよりも日付を適切に扱えるようになりました。
# ActiveSupport 3.x "asdf".to_date # => NoMethodError: undefined method `div' for nil:NilClass "333".to_date # => NoMethodError: undefined method `div' for nil:NilClass # ActiveSupport 4 "asdf".to_date # => ArgumentError: invalid date "333".to_date # => Fri, 29 Nov 2013
9.2 非推奨
ActiveSupport::TestCase#pending
メソッドが非推奨になりました。今後はminitestのskip
をご利用ください。ActiveSupport::Benchmarkable#silence
はスレッドセーフでないため非推奨となりました。Rails 4.1では代替されることなく削除される予定です。ActiveSupport::JSON::Variable
は非推奨になりました。カスタムのJSON文字列リテラルを扱いたい場合は、#as_json
と#encode_json
メソッドを自分で定義してください。互換用の
Module#local_constant_names
メソッドは非推奨になりました。今後はシンボルを返すModule#local_constants
をご利用ください。BufferedLogger
は非推奨になりました。今後はActiveSupport::Logger
またはRuby標準ライブラリのロガーをご利用ください。assert_present
およびassert_blank
は非推奨になりました。今後はassert object.blank?
やassert object.present?
をご利用ください。
10 Action Pack
変更の詳細についてはChangelog を参照してください。
10.1 主な変更点
- developmentモードでの例外ページのスタイルシートが変更されました。また、例外ページにはその例外が実際に発生したコードの行や断片も常に表示されるようになりました。
10.2 非推奨
11 Active Record
変更の詳細についてはChangelog を参照してください。
11.1 主な変更点
-
マイグレーションで
change
を書く方法が改良され、以前のようにup
やdown
メソッドを使用する必要がなくなりました。-
drop_table
メソッドとremove_column
メソッドは逆方向のマイグレーション (取り消し) が可能になりました。ただしそのために必要な情報が与えられていることが前提です。remove_column
メソッドは従来複数のカラムを引数に指定する際に使用されていましたが、今後はそのような場合にはremove_columns
メソッドをご利用ください (ただしこちらは逆マイグレーションできません)。change_table
も逆マイグレーション可能になりました。ただしそのブロックでremove
、change
、change_default
が呼び出されていないことが前提です。 -
reversible
メソッドが新たに追加され、マイグレーション (up) や逆マイグレーション (down) 時に実行するコードを指定できるようになりました。 詳細についてはActive Record マイグレーションガイドを参照してください。 - 新しい
revert
メソッドは、特定のブロックやマイグレーション全体を逆転します。 逆マイグレーション (down) を行うと、指定されたマイグレーションやブロックは通常のマイグレーション (up) になります。 詳細についてはActive Record マイグレーションガイドを参照してください。
-
PostgreSQLの配列型サポートが追加されました。配列カラムの作成時に任意のデータ型を使用できます。それらのデータ型はフルマイグレーションやスキーマダンプでもサポートされます。
Relation#load
メソッドが追加されました。これはレコードを明示的に読み込んでself
を返します。Model.all
がActiveRecord::Relation
を返すようになりました。従来はレコードの配列を返していました。レコードの配列がどうしても必要な場合はRelation#to_a
をご利用ください。ただし場合によっては今後のアップグレード時に正常に動作しなくなることがありえます。ActiveRecord::Migration.check_pending!
が追加されました。これはマイグレーションが延期されている場合にエラーを発生します。-
ActiveRecord::Store
用のカスタムコーダーのサポートが追加されました。これにより、以下のような方法でカスタムコーダーを設定できます。store :settings, accessors: [ :color, :homepage ], coder: JSON
mysql
やmysql2
への接続時にデフォルトでSQL_MODE=STRICT_ALL_TABLES
が設定されるようになりました。これはデータ損失時に何も通知されない状態を回避するための設定です。database.yml
ファイルでstrict: false
を指定するとこの設定は無効になります。IdentityMapは削除されました。
EXPLAINクエリの自動実行は削除されました。この
active_record.auto_explain_threshold_in_seconds
オプションは今後利用されないので削除する必要があります。ActiveRecord::NullRelation
とActiveRecord::Relation#none
が追加されました。これらはRelationクラスにnullオブジェクトパターンを実装するためのものです。create_join_table
マイグレーションヘルパーが追加されました。これはHABTM (Has And Belongs To Many) 結合テーブルを作成します。PostgreSQL hstoreレコードを作成できるようになりました。
11.2 非推奨
従来のハッシュベースのfind関連APIメソッドは非推奨になりました。これにより、従来利用できた「findオプション」はサポートされなくなりました。
-
動的なfind関連メソッドは、
find_by_...
とfind_by_...!
を除いて非推奨になりました。以下の要領でコードを書き直してください。-
find_all_by_...
はwhere(...)
で書き直せる。 -
find_last_by_...
はwhere(...).last
で書き直せる。 -
scoped_by_...
はwhere(...)
で書き直せる。 -
find_or_initialize_by_...
はfind_or_initialize_by(...)
で書き直せる。 -
find_or_create_by_...
はfind_or_create_by(...)
で書き直せる。 -
find_or_create_by_...!
はfind_or_create_by!(...)
で書き直せる。
-
12 クレジット表記
Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に敬意を表明いたします。