1 Rails 4.0 へのアップグレード
既存のアプリケーションをアップグレードする場合は、アップグレードする前に十分なテストカバレッジを持っていることが重要です。また、Rails 4.0 への更新を試みる前に、まず Rails 3.2 にアップグレードし、アプリケーションが予想どおりに動作することを確認してください。アップグレード時に注意するべき事項のリストは、Upgrading Ruby on Rails ガイドで入手できます。
2 Rails 4.0 アプリケーションの作成
# 'rails' RubyGem がインストールされている必要があります
$ rails new myapp
$ cd myapp
2.1 Gems のベンダリング
Rails は、アプリケーションのルートにある Gemfile
を使用して、アプリケーションの起動に必要な gem を決定します。この Gemfile
は、Bundler gem によって処理され、すべての依存関係がインストールされます。さらに、アプリケーションに依存関係がシステムの gem に依存しないように、すべての依存関係をローカルにインストールすることもできます。
詳細はこちら: Bundler ホームページ
2.2 最新版を使用する
Bundler
と Gemfile
を使用すると、新しい専用の bundle
コマンドを使用して、Rails アプリケーションを簡単にフリーズすることができます。Git リポジトリから直接バンドルする場合は、--edge
フラグを渡すことができます。
$ rails new myapp --edge
Rails リポジトリのローカルチェックアウトがあり、それを使用してアプリケーションを生成したい場合は、--dev
フラグを渡すことができます。
$ ruby /path/to/rails/railties/bin/rails new myapp --dev
3 主要な機能
3.1 アップグレード
- Ruby 1.9.3 (commit) - Ruby 2.0 が推奨されます。1.9.3+ が必要です。
- 新しい非推奨ポリシー - Rails 4.0 では非推奨の機能は警告となり、Rails 4.1 で削除されます。
- ActionPack ページキャッシュとアクションキャッシュ (commit) - ページキャッシュとアクションキャッシュは別の gem に抽出されました。ページキャッシュとアクションキャッシュは手動でキャッシュを削除する必要があります(基になるモデルオブジェクトが更新された場合に手動でキャッシュを削除する必要があります)。代わりに、Russian doll caching を使用してください。
- ActiveRecord オブザーバー (commit) - オブザーバーは別の gem に抽出されました。オブザーバーはページキャッシュとアクションキャッシュにのみ必要であり、スパゲッティコードにつながる可能性があります。
- ActiveRecord セッションストア (commit) - ActiveRecord セッションストアは別の gem に抽出されました。SQL でセッションを保存するのはコストがかかります。代わりに、クッキーセッション、メモリキャッシュセッション、またはカスタムセッションストアを使用してください。
- ActiveModel の大量代入保護 (commit) - Rails 3 の大量代入保護は非推奨です。代わりに、strong parameters を使用してください。
- ActiveResource (commit) - ActiveResource は別の gem に抽出されました。ActiveResource は広く使用されていませんでした。
vendor/plugins の削除 (commit) - インストールされた gem を管理するために
Gemfile
を使用してください。ActionPack
Strong parameters (commit) - パラメータを許可されたものだけでモデルオブジェクトを更新する(
params.permit(:title, :text)
)。Routing concerns (commit) - ルーティングDSLで共通のサブルートを抽出する(
/posts/1/comments
と/videos/1/comments
からcomments
を抽出)。ActionController::Live (commit) -
response.stream
を使用してJSONをストリームで送信する。Declarative ETags (commit) - アクションのETag計算の一部となるコントローラレベルのETag追加を追加する。
Russian doll caching (commit) - ビューのネストされたフラグメントをキャッシュする。各フラグメントは依存関係(キャッシュキー)に基づいて期限が切れる。キャッシュキーは通常、テンプレートのバージョン番号とモデルオブジェクトです。
Turbolinks (commit) - 初期のHTMLページのみを提供する。ユーザーが別のページに移動すると、pushStateを使用してURLを更新し、AJAXを使用してタイトルと本文を更新します。
Decouple ActionView from ActionController (commit) - ActionViewはActionPackから切り離され、Rails 4.1では別のgemに移動します。
Do not depend on ActiveModel (commit) - ActionPackはもはやActiveModelに依存しません。
3.2 General
- ActiveModel::Model (commit) -
ActiveModel::Model
は、通常のRubyオブジェクトをActionPackと連携させるためのミックスインです(例:form_for
のため)。 - New scope API (commit) - スコープは常に呼び出し可能なものを使用する必要があります。
- Schema cache dump (commit) - Railsの起動時間を改善するために、データベースからスキーマを直接ロードする代わりに、ダンプファイルからスキーマをロードします。
- Support for specifying transaction isolation level (commit) - 繰り返し可能な読み取りまたはパフォーマンスの向上(ロックの削減)のどちらが重要かを選択します。
- Dalli (commit) - Dalliメモリキャッシュクライアントをメモリキャッシュストアに使用します。
- Notifications start & finish (commit) - Active Supportのインストルメンテーションは、開始と終了の通知をサブスクライバに報告します。
- Thread safe by default (commit) - Railsは追加の設定なしでスレッドセーフなアプリケーションサーバで実行できます。
注意:使用しているgemがスレッドセーフであることを確認してください。
- PATCH verb (commit) - Railsでは、PUTの代わりにPATCHが使用されます。PATCHはリソースの部分的な更新に使用されます。
3.3 Security
- match do not catch all (commit) - ルーティングDSLでは、HTTPの動詞を指定する必要があります。
- html entities escaped by default (commit) - erbでレンダリングされる文字列は、
raw
でラップされていない限りエスケープされます。 - New security headers (commit) - Railsは以下のヘッダをすべてのHTTPリクエストで送信します:
X-Frame-Options
(ブラウザがページをフレームに埋め込むことを禁止するためのクリックジャッキング防止)、X-XSS-Protection
(ブラウザにスクリプトの挿入を停止するように要求)、X-Content-Type-Options
(ブラウザがjpegをexeとして開かないようにする)。 機能の抽出からジェムへの変更 ---------------------------
Rails 4.0では、いくつかの機能がジェムに抽出されました。機能を復元するには、単純に抽出されたジェムをGemfile
に追加するだけです。
- ハッシュベースおよびダイナミックな検索メソッド(GitHub)
- Active Recordモデルでのマスアサインメント保護(GitHub、Pull Request)
- ActiveRecord::SessionStore(GitHub、Pull Request)
- Active Record Observers(GitHub、Commit)
- Active Resource(GitHub、Pull Request、Blog)
- Action Caching(GitHub、Pull Request)
- Page Caching(GitHub、Pull Request)
- Sprockets(GitHub)
- パフォーマンステスト(GitHub、Pull Request)
4 ドキュメンテーション
ガイドはGitHub Flavored Markdownで書き直されました。
ガイドはレスポンシブデザインになりました。
5 Railties
詳細な変更については、Changelogを参照してください。
5.1 注目すべき変更
新しいテストの場所
test/models
、test/helpers
、test/controllers
、test/mailers
。対応するrakeタスクも追加されました。 (Pull Request)アプリケーションの実行可能ファイルは、
bin/
ディレクトリにあります。bin/bundle
、bin/rails
、bin/rake
を取得するには、rake rails:update:bin
を実行してください。デフォルトでスレッドセーフ
rails new
に--builder
(または-b
)を渡すことで、カスタムビルダーを使用する機能が削除されました。代わりにアプリケーションテンプレートを使用してください。 (Pull Request)
5.2 廃止予定
config.threadsafe!
は、より細かい制御を提供するconfig.eager_load
に置き換えられました。Rails::Plugin
は廃止されました。vendor/plugins
にプラグインを追加する代わりに、パスやgitの依存関係を使用するか、gemsまたはbundlerを使用してください。
6 Action Mailer
詳細な変更については、Changelogを参照してください。
6.1 注目すべき変更
6.2 廃止予定
7 Active Model
詳細な変更については、Changelogを参照してください。
7.1 注目すべき変更
ActiveModel::ForbiddenAttributesProtection
を追加しました。これは、許可されていない属性が渡された場合に属性をマスアサインメントから保護するためのシンプルなモジュールです。ActiveModel::Model
を追加しました。これは、RubyオブジェクトをAction Packとの互換性を持つようにするためのミックスインです。
7.2 廃止予定
8 Active Support
詳細な変更については、Changelogを参照してください。
8.1 注目すべき変更
ActiveSupport::Cache::MemCacheStore
で非推奨のmemcache-client
ジェムをdalli
で置き換えました。ActiveSupport::Cache::Entry
を最適化してメモリ使用量と処理オーバーヘッドを削減しました。インフレクションはロケールごとに定義できるようになりました。
singularize
とpluralize
は追加の引数としてロケールを受け入れます。Object#try
は、受信オブジェクトがメソッドを実装していない場合にNoMethodErrorを発生させる代わりに、nilを返すようになりました。ただし、新しいObject#try!
を使用することで、古い動作を維持することもできます。String#to_date
は、無効な日付が与えられた場合にArgumentError: invalid date
を発生させるようになりました。これは、Date.parse
と同じで、3.xよりも多くの無効な日付を受け入れます。 ```rubyActiveSupport 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 ```
8.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
を使用してください(シンボルを返します)。ActiveSupport::BufferedLogger
は廃止予定です。代わりにActiveSupport::Logger
または Ruby 標準ライブラリのロガーを使用してください。assert_present
とassert_blank
はassert object.blank?
とassert object.present?
に置き換えるために廃止予定です。
9 Action Pack
詳細な変更については、Changelog を参照してください。
9.1 注目すべき変更点
- 開発モードの例外ページのスタイルシートを変更しました。さらに、例外が発生したコードの行とフラグメントもすべての例外ページに表示されます。
9.2 廃止予定
10 Active Record
詳細な変更については、Changelog を参照してください。
10.1 注目すべき変更点
change
マイグレーションの書き方を改善し、古いup
とdown
メソッドは不要になりました。drop_table
メソッドとremove_column
メソッドは、必要な情報が与えられている限り、逆変換可能になりました。remove_column
メソッドは複数の列名を受け付けていたが、代わりにremove_columns
を使用してください(逆変換不可)。change_table
メソッドも逆変換可能になりましたが、そのブロックがremove
、change
、change_default
を呼び出さない限りです。reversible
メソッドを使用すると、マイグレーションを上方向または下方向に実行するときに実行するコードを指定できます。 Migration ガイドを参照してください。revert
メソッドは、マイグレーション全体または指定されたブロックを逆変換します。 下方向にマイグレーションする場合、指定されたマイグレーション/ブロックは通常通り実行されます。 Migration ガイドを参照してください。
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オブジェクトパターンを実装します。HABTMの結合テーブルを作成するための
create_join_table
マイグレーションヘルパーを追加します。PostgreSQLのhstoreレコードの作成を許可します。
10.2 廃止予定
古いスタイルのハッシュベースの検索APIは廃止されました。これは、以前に「検索オプション」を受け入れていたメソッドがもはや受け入れないことを意味します。
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!(...)
を使用して書き換えることができます。
11 クレジット
Railsを安定かつ堅牢なフレームワークにするために多くの時間を費やした多くの人々に感謝します。Railsの貢献者の完全なリストを参照してください。彼ら全員に敬意を表します。
フィードバック
このガイドの品質向上にご協力ください。
タイポや事実の誤りを見つけた場合は、ぜひ貢献してください。 開始するには、ドキュメントへの貢献セクションを読んでください。
不完全なコンテンツや最新でない情報も見つかるかもしれません。 メインのドキュメントに不足しているドキュメントを追加してください。 修正済みかどうかは、まずEdge Guidesを確認してください。 スタイルと規約については、Ruby on Rails Guides Guidelinesを確認してください。
修正すべき点を見つけたが、自分で修正できない場合は、 問題を報告してください。
そして最後に、Ruby on Railsのドキュメントに関するあらゆる議論は、公式のRuby on Railsフォーラムで大歓迎です。