Rails 4.1の注目ポイント
config/secrets.yml
本リリースノートでは、主要な変更についてのみ説明します。細かなバグ修正や変更については、change logを参照するか、GitHubの主要なRailsリポジトリにあるコミットリストを参照してください。
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのがよい考えです。アプリケーションがRails 4.0までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 4.1にアップデートしてください。アップグレードの注意点などについてはRuby on Railsアップグレードガイドを参照してください。
SpringはRailsアプリケーション用のプリローダーです。アプリケーションをバックグラウンドで常駐させることで開発速度を向上させ、テストやrakeタスク、マイグレーションを実行するたびにRailsを起動しないで済むようにします。
Rails 4.1アプリケーションに含まれるbinstubは「spring化」されています。これは、アプリケーションのルートディレクトリでbin/rails
およびbin/rake
を実行すると自動的にspring環境をプリロードするということです。
rakeタスクの実行:
bin/rake test:models
Railsコマンドの実行:
bin/rails console
Springの状態確認:
$ bin/spring status Spring is running: 1182 spring server | my_app | started 29 mins ago 3656 spring app | my_app | started 23 secs ago | test mode 3746 spring app | my_app | started 10 secs ago | development mode
Springのすべての機能についてはSpring READMEを参照してください。
Ruby on Railsアップグレードガイドには、この機能を既存のアプリケーションと統合する方法について記載されています。
config/secrets.yml
Rails 4.1ではconfig
フォルダ内に新しくsecrets.yml
ファイルが生成されます。デフォルトでは、このファイルにはアプリケーションのsecret_key_base
が含まれていますが、外部API用のアクセスキーなどの秘密キーもここに保存できます。
このファイルに保存された秘密キーはRails.application.secrets
を用いてアクセスできます。
たとえば、以下のconfig/secrets.yml
について見てみましょう。
development: secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 some_api_key: SOMEKEY
上の設定にした場合、development環境でRails.application.secrets.some_api_key
を実行するとSOMEKEY
が返されます。
既存のアプリケーションにこの機能を統合する方法についてはRuby on Railsアップグレードガイドを参照してください。
スマートフォン、タブレット、デスクトップブラウザごとに異なるHTML/JSON/XMLテンプレートを使いたいことはよくあります。Variantを使うことで、これを簡単に実現できます。
リクエストvariantは、:tablet
、:phone
、:desktop
のようなリクエストフォーマットを特殊化したものです。
before_action
で以下のvariantを設定できます。
request.variant = :tablet if request.user_agent =~ /iPad/
アクションの側では、フォーマットへの応答と同じ要領でvariantに応答します。
respond_to do |format| format.html do |html| html.tablet # renders app/views/projects/show.html+tablet.erb html.phone { extra_setup; render ... } end end
フォーマットごと、variantごとに個別のテンプレートを用意してください。
app/views/projects/show.html.erb app/views/projects/show.html+tablet.erb app/views/projects/show.html+phone.erb
以下のようなインライン文法を使うことで、variant定義を簡略化することもできます。
respond_to do |format| format.js { render "trash" } format.html.phone { redirect_to progress_path } format.html.none { render "trash" } end
Action Mailerプレビューは、特定のURLにアクセスすることで、送信されるメールがどんなふうに見えるかをレンダリングしてプレビューします。
チェックしたいメールオブジェクトを返すメソッドを持つプレビュークラスを定義してください。
class NotifierPreview < ActionMailer::Preview def welcome Notifier.welcome(User.first) end end
このプレビューを表示するには、http://localhost:3000/rails/mailers/notifier/welcome
にアクセスします。プレビューのリストはhttp://localhost:3000/rails/mailers
で表示できます。
デフォルトのプレビュークラスはtest/mailers/previews
に置かれます。
preview_path
オプションを変更することでこれを変更できます。
詳細についてはドキュメントを参照してください。
データベースで値をintegerにマップしたい場所でenum属性を宣言しますが、名前でクエリを発行することもできます。
class Conversation < ActiveRecord::Base enum status: [ :active, :archived ] end conversation.archived! conversation.active? # => false conversation.status # => "archived" Conversation.archived # => Relation for all archived Conversations Conversation.statuses # => { "active" => 0, "archived" => 1 }
詳細についてはマニュアルを参照してください。
メッセージベリファイア(message verifier)は、署名付きメッセージの生成と照合に利用できます。この機能は、「パスワードを保存(remember me)」トークンや友人リストのような機密データを安全に転送するときに便利です。
Rails.application.message_verifier
メソッドは、secret_key_baseで生成されたキーで署名された新しいメッセージベリファイアと、与えられたメッセージ照合名を返します。
signed_token = Rails.application.message_verifier(:remember_me).generate(token) Rails.application.message_verifier(:remember_me).verify(signed_token) # => token Rails.application.message_verifier(:remember_me).verify(tampered_token) # ActiveSupport::MessageVerifier::InvalidSignatureを発生する
自然かつ堅苦しくない方法で、クラスから責任を分離します。
class Todo < ActiveRecord::Base concerning :EventTracking do included do has_many :events end def latest_event ... end private def some_internal_method ... end end end
この例は、EventTracking
モジュールをインラインで定義し、ActiveSupport::Concern
でextendし、Todo
クラスにミックスインしたのと同等です。
詳細および想定されるユースケースについてはマニュアルを参照してください。
<script>
タグにCSRF保護を実施JavaScriptレスポンスを伴うGETリクエストもクロスサイトリクエストフォージェリ(CSRF)保護の対象となりました。この保護によって、第三者のサイトが重要なデータの奪取のために自分のサイトのJavaScript URLを参照して実行しようとすることを防止します。
これは、xhr
を使わない場合、.js
URLにヒットするすべてのテストはCSRF保護によって失敗するということです。`XmlHttpRequests
を明示的に想定するようにテストをアップグレードしてください。post :create, format: :js
の代わりに、明示的にxhr :post, :create, format: :js
をお使いください。
変更の詳細についてはChangelogを参照してください。
update:application_controller
rake taskが削除されました。
非推奨のRails.application.railties.engines
が除外されました。
非推奨のthreadsafe!
がRails Configから削除されました。
非推奨のActiveRecord::Generators::ActiveModel#update_attributes
が削除されました。ActiveRecord::Generators::ActiveModel#update
をお使いください。
非推奨のconfig.whiny_nils
オプションが削除されました。
非推奨のテスト実行rakeタスクrake test:uncommitted
およびrake test:recent
が削除されました。
Springアプリケーションプリローダーは新規アプリケーションにデフォルトでインストールされます。Gemfile
のdevelopグループにインストールされ、productionグループにはインストールされません。(プルリク)
テスト失敗時にフィルタされていないバックトレースを表示するBACKTRACE
環境変数。(コミット)
MiddlewareStack#unshift
が環境構成用に公開されました。(プルリク)
メッセージベリファイアを返すApplication#message_verifier
メソッド。(プルリク)
デフォルトで生成されるテストヘルパーでrequireされるtest_help.rb
ファイルは、db/schema.rb
(またはdb/structure.sql
)を用いて自動的にテストデータベースを最新の状態に保ちます。スキーマを再度読み込んでもペンディング中のマイグレーションをすべて解決できなかった場合はエラーが発生します。config.active_record.maintain_test_schema = false
を指定することでエラーを回避できます。(プルリク)
Gem::Version.new(Rails.version)
を返す便利なメソッドとしてRails.gem_version
が導入されました。より信頼できるバージョン比較法を提供します。(プルリク)
変更の詳細についてはChangelogを参照してください。
非推奨の、結合テスト用Railsアプリケーションフォールバックが削除されました。ActionDispatch.test_app
を代わりにお使いください。
非推奨のpage_cache_extension
コンフィグが削除されました。
非推奨のActionController::RecordIdentifier
が削除されました。ActionView::RecordIdentifier
を代わりにお使いください。
以下の非推奨の定数がAction Controllerから削除されました。
削除された | 今後使う |
---|---|
ActionController::AbstractRequest | ActionDispatch::Request |
ActionController::Request | ActionDispatch::Request |
ActionController::AbstractResponse | ActionDispatch::Response |
ActionController::Response | ActionDispatch::Response |
ActionController::Routing | ActionDispatch::Routing |
ActionController::Integration | ActionDispatch::Integration |
ActionController::IntegrationTest | ActionDispatch::IntegrationTest |
protect_from_forgery
によって、クロスオリジン<script>
タグも利用できなくなりました。テストをアップデートして、get :foo, format: :js
の代わりにxhr :get, :foo, format: :js
を使うようにしてください。(プルリク)
#url_for
は、オプションのハッシュを配列の中で使えるようになりました。(プルリク)
session#fetch
メソッドが追加されました。この振る舞いはHash#fetchと似ていますが、戻り値が常にセッションに保存される点が異なります。(プルリク)
Action ViewはAction Packから完全に分離されました。(プルリク)
deep_mungeに影響されているキーがログ出力されるようになりました。(プルリク)
セキュリティ脆弱性CVE-2013-0155に対応するため、パラメータのdeep_munge化を回避するconfig.action_dispatch.perform_deep_munge
configオプションが新たに追加されました。(プルリク)
署名及び暗号化されたcookies jarのシリアライザを指定するconfig.action_dispatch.cookies_serializer
configオプションが新たに追加されました。(プルリク1、2/詳細)
変更の詳細についてはChangelogを参照してください。
37 Signals社のmail_view gemを元にメーラーのプレビュー機能が追加されました。(コミット)
Action Mailerメッセージの生成が計測されるようになりました。メッセージを生成するのにかかった時間がログに記録されます。(プルリク)
変更の詳細についてはChangelogを参照してください。
SchemaCache
メソッド(primary_keys
、tables
、columns
、columns_hash
)にnilを渡す非推奨機能が削除されました。
非推奨のブロックフィルタがActiveRecord::Migrator#migrate
から削除されました。
非推奨のStringコンストラクタがActiveRecord::Migrator
から削除されました。
scope
で呼び出し可能オブジェクトを渡さない用法が削除されました。
非推奨のtransaction_joinable=
が削除されました。:joinable
オプション付きでbegin_transaction
をお使いください。
非推奨のdecrement_open_transactions
が削除されました。
非推奨のincrement_open_transactions
が削除されました。
非推奨のPostgreSQLAdapter#outside_transaction?
メソッドが削除されました。代わりに#transaction_open?
をお使いください。
非推奨のActiveRecord::Fixtures.find_table_name
が削除されました。ActiveRecord::Fixtures.default_fixture_model_name
をお使いください。
非推奨のcolumns_for_remove
がSchemaStatements
から削除されました。
非推奨のSchemaStatements#distinct
が削除されました。
非推奨のActiveRecord::TestCase
がRailsテストスイートに移動しました。このクラスはpublicでなくなり、Railsテストの内部でのみ使われます。
関連付けの:dependent
で、非推奨の:restrict
オプションのサポートが削除されました。
関連付けにおいて、非推奨の:delete_sql
、:insert_sql
、:finder_sql
、:counter_sql
オプションが削除されました。
Columnから非推奨のtype_cast_code
が削除されました。
非推奨のActiveRecord::Base#connection
メソッドが削除されました。このメソッドにはクラス経由でアクセスするようにしてください。
auto_explain_threshold_in_seconds
における非推奨の警告が削除されました。
Relation#count
から非推奨の:distinct
オプションが削除されました。
非推奨のpartial_updates
、partial_updates?
、partial_updates=
が削除されました。
非推奨のscoped
メソッドが削除されました。
非推奨のdefault_scopes?
が削除されました。
4.0で非推奨だった、暗黙の結合参照が削除されました。
依存関係としてのactiverecord-deprecated_finders
が削除されました。詳細についてはgem READMEを参照してください。
implicit_readonly
の用法が削除されました。明示的にreadonly
メソッドを用いてレコードをreadonly
に設定してください。(プルリク)
quoted_locking_column
メソッドは非推奨です。現在使われている場所はありません。
ConnectionAdapters::SchemaStatements#distinct
は内部で使われなくなったため非推奨です。(プルリク)
rake db:test:*
タスクは非推奨となりました。データベースは自動的にメンテナンスされます。railtiesのリリースノートを参照してください。(プルリク)
使われていないActiveRecord::Base.symbolized_base_class
、および置き換えのないActiveRecord::Base.symbolized_sti_name
は非推奨になりました。コミット
デフォルトのスコープは、条件を連鎖した場合にオーバーライドされなくなりました。
今回の変更より前にモデルでdefault_scope
を定義していた場合、同じフィールドで条件が連鎖している場合にはオーバーライドされていました。現在は、他のスコープと同様、マージされるようになりました。詳細
モデルの属性やメソッドから派生する便利な "pretty" URL用にActiveRecord::Base.to_param
が追加されました。(プルリク)
ActiveRecord::Base.no_touching
が追加されました。モデルへのタッチを無視します。(プルリク)
MysqlAdapter
およびMysql2Adapter
における型変換の真偽値が統一されました。type_cast
はtrue
の場合に1
を、false
の場合に2
を返します。(プルリク)
.unscope
を指定するとdefault_scope
で指定された条件が削除されます。(コミット)
ActiveRecord::QueryMethods#rewhere
が追加されました。既存の名前付きwhere条件をオーバーライドします。(コミット)
ActiveRecord::Base#cache_key
が拡張され、timestamp属性のリストをオプションで取れるようになりました。timestamp属性リストのうち最大値が使われます。(コミット)
enum属性を宣言するActiveRecord::Base#enum
が追加されました。enum属性はデータベースのintegerにマップされますが、名前でクエリできます。(コミット)
JSON値が書き込み時に型変換されます。これにより値がデータベースからの読み出し時と一貫します。(プルリク)
hstore値が書き込み時に型変換されます。これにより値がデータベースからの読み出し時と一致します。(コミット)
サードパーティ製ジェネレータ用に、next_migration_number
がアクセス可能になりました。(プルリク)
引数をnil
にしてupdate_attributes
を呼び出すと、常にArgumentError
エラーが発生します。具体的には、渡された引数がstringify_keys
に応答しない場合にエラーが発生します。(プルリク)
(has_many
などでの)CollectionAssociation#first
/#last
による結果の取り出しで、コレクション全体を読み出すクエリの代わりに、限定的なクエリが使われるようになりました。(プルリク)
Active Recordモデルクラスのinspect
は新しい接続を初期化しなくなりました。つまり、データベースが見つからない状態でinspect
を呼び出した場合に例外を発生しなくなりました。(プルリク)
count
のカラム制約が削除されました。SQLが無効な場合にはデータベース側でraiseされます。(プルリク)
Railsが逆関連付けを自動で検出するようになりました。関連付けで:inverse_of
オプションを設定していない場合、Active Recordはヒューリスティックに逆関連付けを推測します。(プルリク)
ActiveRecord::Relationの属性のエイリアスを扱うようになりました。シンボルキーを使うと、ActiveRecordはエイリアス化された属性名をデータベース上の実際のカラム名に翻訳します。(プルリク)
フィクスチャーのERBファイルはメインオブジェクトのコンテキストでは評価されなくなりました。複数のフィクスチャーで使われているヘルパーメソッドは、ActiveRecord::FixtureSet.context_class
でインクルードされるモジュール上で定義しておく必要があります。(プルリク)
RAILS_ENVが明示的に指定されている場合はテストデータベースのcreateやdropは行いません。(プルリク)
Relation
に#map!
や#delete_if
などのミューテーターメソッド(mutator method)が含まれなくなりました。これらのメソッドを使いたい場合は#to_a
を呼び出してArray
に変更してからにしてください。(プルリク)
find_in_batches
、find_each
、Result#each
、Enumerable#index_by
は、自身のサイズを計算可能なEnumerator
を返すようになりました。(プルリク)
scope
、enum
とAssociationsで "dangerous" 名前衝突が発生するようになりました。(プルリク, プルリク)
second
からfifth
メソッドはfirst
ファインダーと同様に動作します。(プルリク)
touch
がafter_commit
とafter_rollback
コールバックを発火するようになりました。(プルリク)
sqlite >= 3.8.0
でのパーシャルインデックスが有効になりました。(プルリク)
change_column_null
が復元可能になりました。(コミット)
マイグレーション後無効になったスキーマダンプにフラグが追加されました。これは新しいアプリケーションのproduction環境ではデフォルトでfalse
に設定されます。(プルリク)
変更の詳細についてはChangelogを参照してください。
Validator#setup
は非推奨です。今後はバリデーターのコンストラクタ内で手動で行なう必要があります。(コミット)ActiveModel::Dirty
に、状態を制御する新しいAPIreset_changes
およびchanges_applied
が追加されました。
検証の定義時に複数のコンテキストを指定できるようになりました。(プルリク)
attribute_changed?
がハッシュを受け付けるようになり、属性が与えられた値に
変更されたか(または与えられた値から
変更されたか)どうかをチェックするようになりました。(プルリク)
変更の詳細についてはChangelogを参照してください。
MultiJSON
依存が削除されました。これにより、ActiveSupport::JSON.decode
はMultiJSON
のオプションハッシュを受け付けなくなりました。(プルリク / 詳細)
カスタムオブジェクトをJSONにエンコードするencode_json
フックのサポートが削除されました。この機能はactivesupport-json_encoder gemに書き出されました。
この機能はactivesupport-json_encoder gemに書き出されました。
非推奨のActiveSupport::JSON::Variable
が代替なしで削除されました。
非推奨のString#encoding_aware?
コア拡張(core_ext/string/encoding
)が削除されました。
非推奨のModule#local_constant_names
が削除されました。Module#local_constants
をお使いください。
非推奨のDateTime.local_offset
が削除されました。DateTime.civil_from_format
をお使いください。
非推奨のLogger
コア拡張(core_ext/logger.rb
)が削除されました。
非推奨のTime#time_with_datetime_fallback
、Time#utc_time
、Time#local_time
が削除されました。Time#utc
およびTime#local
をお使いください。
非推奨のHash#diff
が代替なしで削除されました。
非推奨のDate#to_time_in_current_zone
が削除されました。Date#in_time_zone
をお使いください。
非推奨のProc#bind
が代替なしで削除されました。
非推奨のArray#uniq_by
とArray#uniq_by!
が削除されました。ネイティブのArray#uniq
およびArray#uniq!
をお使いください。
非推奨のActiveSupport::BasicObject
が削除されました。ActiveSupport::ProxyObject
をお使いください。
非推奨のBufferedLogger
が削除されました。ActiveSupport::Logger
をお使いください。
非推奨のassert_present
メソッドとassert_blank
メソッドが削除されました。assert object.blank?
およびassert object.present?
をお使いください。
フィルタオブジェクト用の非推奨#filter
メソッドが削除されました。対応する別のメソッドをお使いください(before filterの#before
など)。
デフォルトの活用形から不規則活用の'cow' => 'kine'が削除されました。(コミット)
時間表現Numeric#{ago,until,since,from_now}
が非推奨になりました。この値はAS::Durationに明示的に変換してください。例: 5.ago
=> 5.seconds.ago
(プルリク)
requireパスactive_support/core_ext/object/to_json
が非推奨になりました。active_support/core_ext/object/json
を代わりにrequireしてください。(プルリク)
ActiveSupport::JSON::Encoding::CircularReferenceError
が非推奨になりました。この機能はactivesupport-json_encoder gemに書き出されました。(プルリク / 詳細)
ActiveSupport.encode_big_decimal_as_string
オプションが非推奨になりました。この機能はactivesupport-json_encoder gemに書き出されました。
(プルリク / 詳細)
カスタムのBigDecimal
シリアライズが非推奨になりました。(プルリク)
ActiveSupport
のJSONエンコーダーが書き直され、pure-RubyのカスタムエンコーディングではなくJSON gemを利用するようになりました。
(プルリク / 詳細)
ActiveSupport::Testing::TimeHelpers#travel
および#travel_to
が追加されました。これらのメソッドは、Time.now
およびDate.today
をスタブ化することによって、現在時刻を指定の時刻または時間に変換します。
ActiveSupport::Testing::TimeHelpers#travel_back
が追加されました。このメソッドは、travel
およびtravel_to
メソッドによって追加されたスタブを削除することで、現在時刻を元の状態に戻します。(プルリク)
Numeric#in_milliseconds
が追加されました。1.hour.in_milliseconds
のように利用でき、これをgetTime()
などのJavaScript関数に渡すことができます。(コミット)
Date#middle_of_day
、DateTime#middle_of_day
、Time#middle_of_day
メソッドが追加されました。エイリアスとしてmidday
、noon
、at_midday
、at_noon
、at_middle_of_day
も追加されました。(プルリク)
期間を生成するためのDate#all_week/month/quarter/year
が追加されました。(プルリク)
Time.zone.yesterday
とTime.zone.tomorrow
が追加されました。(プルリク)
よく使われるString#gsub("pattern,'')
の省略表現としてString#remove(pattern)
が追加されました。(コミット)
値がnilの項目をハッシュから削除するためのHash#compact
およびHash#compact!
が追加されました。(プルリク)
blank?
およびpresent?
はシングルトンを返します。(コミット)
新しいI18n.enforce_available_locales
コンフィグのデフォルトはtrue
です。これは、ロケールに渡されたI18n
がavailable_locales
リストに載っていなければならないということです。(プルリク)
Module#concerning
が導入されました。自然かつ堅苦しくない方法で、クラスから責任を分離します。(コミット)
Object#presence_in
が追加されました。値を単に許可済みリストに追加します。(コミット)膨大な時間を費やしてRailsを作り、頑丈かつ安定したフレームワークにしてくれた多くの皆様については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に敬意を表明いたします。
Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。
原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨
本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。
Railsガイド運営チーム (@RailsGuidesJP)
Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。