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) を明示的に1つまたは複数指定する必要があります。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
をご利用ください。
ActiveSupport::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ガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。