Ruby on Rails 4.0 リリースノート

Rails 4.0の注目ポイント

本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GithubのRailsリポジトリにあるコミットリストのchangelogを参照してください。

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を指定します。このGemfileBundlerというgemによって処理され、依存関係のある必要なgemをすべてインストールします。依存するgemをそのアプリケーションの中にだけインストールして、OS環境にある既存のgemに影響を与えないようにすることもできます。

詳細情報: Bundlerホームページ

2.2 最新のgemを使う

BundlerGemfileのおかげで、専用のbundleコマンド一発でRailsアプリケーションのgemを簡単に安定させることができます。Gitリポジトリから直接bundleしたい場合は--edgeフラグを追加します。

$ rails new myapp --edge

Railsアプリケーションのリポジトリをローカルにチェックアウトしたものがあり、それを使ってアプリケーションを生成したい場合は、--devフラグを追加します。

$ ruby /path/to/rails/railties/bin/rails new myapp --dev

3 主要な変更

Rails 4.0

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内でレンダリングされる文字列は、rawhtml_safeメソッドでラップしない限り常にエスケープされます。
  • 新しいセキュリティヘッダー (コメント) - Railsから送信されるあらゆるHTTPリクエストに次のヘッダーが含まれるようになりました: X-Frame-Options (クリックジャック防止のため、フレーム内へのページ埋め込みを禁止するようブラウザに指示する)、X-XSS-Protection (スクリプト注入を停止するようブラウザに指示する)、X-Content-Type-Options (jpegファイルをexeとして開かないようブラウザに指示する)。

4 外部gem化された機能

Rails 4.0では多くの機能が切り出されてgemに移行しました。切り出されたgemをGemfileファイルに追加するだけでこれまでと同様に利用できます。

5 ドキュメント

  • ガイドはGitHub-flavored Markdownで書き直されました。

  • ガイドのデザインがレスポンシブになりました。

6 Railties

変更の詳細についてはChangelog を参照してください。

6.1 主な変更点

  • テスト用ディレクトリが追加されました: test/modelstest/helperstest/controllerstest/mailersこれらに対応するrakeタスクも追加されました。(Pull Request)

  • アプリケーション内の実行ファイルはbin/ディレクトリに置かれるようになりました。rake rails:update:binを実行するとbin/bundlebin/railsbin/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::MemCacheStoredalliに置き換えました。

  • ActiveSupport::Cache::Entryが最適化され、メモリ使用量と処理のオーバーヘッドが軽減されました。

  • 語の活用形 (inflection) をロケールごとに設定できるようになり、singularizepluralizeメソッドの引数にロケールも指定できるようになりました。

  • 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を書く方法が改良され、以前のようにupdownメソッドを使う必要がなくなりました。

    • drop_tableメソッドとremove_columnメソッドは逆方向のマイグレーション (取り消し) が可能になりました。ただしそのために必要な情報が与えられていることが前提です。 remove_columnメソッドは従来複数のカラムを引数に指定する際に使われていましたが、今後はそのような場合にはremove_columnsメソッドをご利用ください (ただしこちらは逆マイグレーションできません)。 change_tableも逆マイグレーション可能になりました。ただしそのブロックでremovechangechange_defaultが呼び出されていないことが前提です。
    • reversibleメソッドが新たに追加され、マイグレーション (up) や逆マイグレーション (down) 時に実行するコードを指定できるようになりました。 詳細についてはActive Record マイグレーションガイドを参照してください。
    • 新しいrevertメソッドは、特定のブロックやマイグレーション全体を逆転します。 逆マイグレーション (down) を行うと、指定されたマイグレーションやブロックは通常のマイグレーション (up) になります。 詳細についてはActive Record マイグレーションガイドを参照してください。
  • PostgreSQLの配列型サポートが追加されました。配列カラムの作成時に任意のデータ型を使えます。それらのデータ型はフルマイグレーションやスキーマダンプでもサポートされます。

  • Relation#loadメソッドが追加されました。これはレコードを明示的に読み込んでselfを返します。

  • Model.allActiveRecord::Relationを返すようになりました。従来はレコードの配列を返していました。レコードの配列がどうしても必要な場合はRelation#to_aをご利用ください。ただし場合によっては今後のアップグレード時に正常に動作しなくなることがありえます。

  • ActiveRecord::Migration.check_pending!が追加されました。これはマイグレーションが延期されている場合にエラーを発生します。

  • ActiveRecord::Store用のカスタムコーダーのサポートが追加されました。これにより、以下のような方法でカスタムコーダーを設定できます。

    store :settings, accessors: [ :color, :homepage ], coder: JSON
    
  • mysqlmysql2への接続時にデフォルトでSQL_MODE=STRICT_ALL_TABLESが設定されるようになりました。これはデータ損失時に何も通知されない状態を回避するための設定です。database.ymlファイルでstrict: falseを指定するとこの設定は無効になります。

  • IdentityMapは削除されました。

  • EXPLAINクエリの自動実行は削除されました。このactive_record.auto_explain_threshold_in_secondsオプションは今後利用されないので削除する必要があります。

  • ActiveRecord::NullRelationActiveRecord::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コントリビューターの完全なリストを参照してください。これらの方々全員に敬意を表明いたします。