Rails 4.0の注目ポイント
本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GithubのRailsリポジトリにあるコミットリストのchangelogを参照してください。
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 3.2までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 4.0にアップデートしてください。アップグレードの注意点などについてはRuby on Railsアップグレードガイド を参照してください。
# 'rails'というRubyGemがインストールされている必要があります。 $ rails new myapp $ cd myapp
Railsでは、アプリケーションのルートディレクトリに置かれるGemfileを使って、アプリケーションの起動に必要なgemを指定します。このGemfileはBundlerというgemによって処理され、依存関係のある必要なgemをすべてインストールします。依存するgemをそのアプリケーションの中にだけインストールして、OS環境にある既存のgemに影響を与えないようにすることもできます。
詳細情報: Bundlerホームページ
BundlerとGemfileのおかげで、専用のbundleコマンド一発でRailsアプリケーションのgemを簡単に安定させることができます。Gitリポジトリから直接bundleしたい場合は--edgeフラグを追加します。
$ rails new myapp --edge
Railsアプリケーションのリポジトリをローカルにチェックアウトしたものがあり、それを使ってアプリケーションを生成したい場合は、--devフラグを追加します。
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
Gemfileでgemのインストールを管理すること。params.permit(:title, :text)) を使わないとモデルオブジェクトを更新できないようにする。/posts/1/commentsと/videos/1/commentsにおけるcommentsなど)。response.streamでストリーミングする。ActiveModel::Modelは通常のRubyオブジェクトでもActionPackの機能を利用できるようにする (form_forなど) ためのミックスイン。追加したgemも同様にスレッドセーフであるかどうかをチェックしておいてください。
matchを使う場合には HTTP動詞 (verb) を明示的にひとつまたは複数指定する必要があります。rawやhtml_safeメソッドでラップしない限り常にエスケープされます。X-Frame-Options (クリックジャック防止のため、フレーム内へのページ埋め込みを禁止するようブラウザに指示する)、X-XSS-Protection (スクリプト注入を停止するようブラウザに指示する)、X-Content-Type-Options (jpegファイルをexeとして開かないようブラウザに指示する)。Rails 4.0では多くの機能が切り出されてgemに移行しました。切り出されたgemをGemfileファイルに追加するだけでこれまでと同様に利用できます。
ガイドはGitHub-flavored Markdownで書き直されました。
ガイドのデザインがレスポンシブになりました。
変更の詳細についてはChangelog を参照してください。
テスト用ディレクトリが追加されました: 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)
config.threadsafe!は非推奨になりました。今後はconfig.eager_loadをご利用ください。後者は一括読み込み (eager load) の対象をさらに細かい粒度で制御できます。
Rails::Pluginは廃止されました。今後はvendor/pluginsにプラグインを追加する代わりに、gemやbundlerでパスやgit依存関係を指定してご利用ください。
変更の詳細についてはChangelog を参照してください。
変更の詳細についてはChangelog を参照してください。
ActiveModel::ForbiddenAttributesProtectionを追加しました。許可されていない属性が渡された場合にマスアサインメントから属性を保護するためのシンプルなモジュールです。
ActiveModel::Modelを追加しました。RubyオブジェクトをAction Packですぐに使えるようにするためのミックスインです。
変更の詳細についてはChangelog を参照してください。
非推奨の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
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?をご利用ください。
変更の詳細についてはChangelog を参照してください。
変更の詳細についてはChangelog を参照してください。
マイグレーションで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レコードを作成できるようになりました。
従来のハッシュベースの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!(...)で書き直せる。Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に敬意を表明いたします。
Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。
原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨
本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。
Railsガイド運営チーム (@RailsGuidesJP)
Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。