edge
詳細はrubyonrails.orgで: もっとRuby on Rails

Ruby on Rails 4.1 リリースノート

Rails 4.1 のハイライト:

これらのリリースノートは主な変更のみをカバーしています。さまざまなバグ修正や変更については、変更ログを参照するか、GitHub のメイン Rails リポジトリのコミットのリストを確認してください。

1 Rails 4.1 へのアップグレード

既存のアプリケーションをアップグレードする場合は、テストカバレッジが十分であることが重要です。また、Rails 4.1 にアップデートする前に、まず Rails 4.0 にアップグレードし、アプリケーションが正常に動作することを確認してからアップデートを試みることをお勧めします。アップグレード時に注意すべき事項のリストは、Upgrading Ruby on Railsガイドで入手できます。

2 主な機能

2.1 Spring アプリケーションプリローダー

Spring は Rails アプリケーションのプリローダーです。テスト、rake タスク、マイグレーションを実行するたびにアプリケーションを起動する必要がなく、アプリケーションをバックグラウンドで実行しておくことで開発を高速化します。

新しい Rails 4.1 アプリケーションには「springified」な binstub が付属しています。つまり、bin/railsbin/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 READMEを参照してください。

既存のアプリケーションをこの機能を使用するように移行する方法については、Upgrading Ruby on Railsガイドを参照してください。

2.2 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

Rails.application.secrets.some_api_key は、開発環境では SOMEKEY を返します。

既存のアプリケーションをこの機能を使用するように移行する方法については、Upgrading Ruby on Railsガイドを参照してください。

2.3 Action Pack のバリアント

私たちはしばしば、電話、タブレット、デスクトップブラウザ向けに異なる HTML/JSON/XML テンプレートをレンダリングしたいと思います。バリアントを使用すると簡単に実現できます。

リクエストのバリアントは、:tablet:phone:desktop のようなリクエストフォーマットの特殊化です。

before_action でバリアントを設定できます:

request.variant = :tablet if request.user_agent =~ /iPad/

アクション内でフォーマットと同様にバリアントに応じてレスポンスを返すことができます:

respond_to do |format|
  format.html do |html|
    html.tablet # app/views/projects/show.html+tablet.erb をレンダリング
    html.phone { extra_setup; render ... }
  end
end

各フォーマットとバリアントに対して別々のテンプレートを用意できます:

app/views/projects/show.html.erb
app/views/projects/show.html+tablet.erb
app/views/projects/show.html+phone.erb

インライン構文を使用してバリアントの定義を簡素化することもできます:

respond_to do |format|
  format.js         { render "trash" }
  format.html.phone { redirect_to progress_path }
  format.html.none  { render "trash" }
end

2.4 Action Mailer プレビュー

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 オプションを使用してこれを設定することができます。

詳細な説明については、ドキュメントを参照してください。

2.5 Active Record enums

データベース内の整数にマップされる値を持つ enum 属性を宣言し、名前でクエリを行うことができます。

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

conversation.archived!
conversation.active? # => false
conversation.status  # => "archived"

Conversation.archived # => 全てのアーカイブされた Conversation の関連

Conversation.statuses # => { "active" => 0, "archived" => 1 }

詳細な説明については、ドキュメントを参照してください。

2.6 Message Verifiers

メッセージ検証子を使用して、署名付きメッセージを生成および検証することができます。これは、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 が発生します

2.7 Module#concerning

クラス内の責任を分離するための自然で簡単な方法です。

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 で拡張し、Todo クラスにミックスインすることと等価です。

詳細な説明と使用例については、ドキュメントを参照してください。

2.8 CSRF 保護とリモート <script> タグからの攻撃

クロスサイトリクエストフォージェリ(CSRF)保護は、JavaScript レスポンスを伴う GET リクエストにも適用されるようになりました。これにより、第三者のサイトが JavaScript URL を参照し、それを実行して機密データを抽出しようとすることを防止します。

これは、.js URL を使用するテストのうち、CSRF 保護が失敗するようになります。これらのテストでは、xhr を使用するように明示的に指定する必要があります。post :create, format: :js の代わりに、明示的な xhr :post, :create, format: :js に切り替えてください。

3 Railties

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

3.1 削除された機能

  • update:application_controller の rake タスクが削除されました。

  • 廃止予定の Rails.application.railties.engines が削除されました。

  • 廃止予定の threadsafe! が Rails Config から削除されました。

  • 廃止予定の ActiveRecord::Generators::ActiveModel#update_attributesActiveRecord::Generators::ActiveModel#update に置き換えられました。

  • 廃止予定の config.whiny_nils オプションが削除されました。

  • テストを実行するための廃止予定の rake タスク rake test:uncommitted および rake test:recent が削除されました。

3.2 注目すべき変更点

  • 新しいアプリケーションでは、Spring アプリケーションプリローダーがデフォルトでインストールされます。これは Gemfile の development グループを使用するため、本番環境ではインストールされません。 (Pull Request)

  • BACKTRACE 環境変数を使用して、テストの失敗時にフィルターされていないバックトレースを表示できるようになりました。 (Commit)

  • 環境設定で MiddlewareStack#unshift を公開しました。 (Pull Request)

  • Application#message_verifier メソッドを追加し、メッセージ検証子を返すようにしました。 (Pull Request)

  • デフォルトで生成されるテストヘルパーによって必要な場合にのみ、テストデータベースが db/schema.rb(または db/structure.sql)と同期されるようになりました。スキーマの再読み込みがすべての保留中のマイグレーションを解決しない場合はエラーが発生します。config.active_record.maintain_test_schema = false で無効にすることもできます。 (Pull Request)

  • Rails.gem_versionを導入し、Gem::Version.new(Rails.version)を返す便利なメソッドとして紹介し、バージョン比較をより信頼性のある方法として提案します。(プルリクエスト)

4 Action Pack

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

4.1 削除

  • 統合テストのための非推奨の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

4.2 注目すべき変更

  • protect_from_forgeryはクロスオリジンの<script>タグも防止します。テストではxhr :get, :foo, format: :jsを使用してください。get :foo, format: :jsの代わりに。(プルリクエスト)

  • #url_forはオプションを含むハッシュを配列の内部に取ります。(プルリクエスト)

  • session#fetchメソッドを追加しました。fetchはHash#fetchと同様に動作しますが、返された値は常にセッションに保存されます。(プルリクエスト)

  • Action ViewをAction Packから完全に分離しました。(プルリクエスト)

  • ディープマージによって影響を受けたキーをログに記録します。(プルリクエスト)

  • セキュリティの脆弱性CVE-2013-0155に対処するために使用されたパラメータの「ディープマージ」をオプトアウトするための新しい設定オプションconfig.action_dispatch.perform_deep_mungeを追加しました。(プルリクエスト)

  • 署名付きおよび暗号化されたクッキージャーのシリアライザを指定するための新しい設定オプションconfig.action_dispatch.cookies_serializerを追加しました。(プルリクエスト1プルリクエスト2 / 詳細)

  • render :plainrender :htmlrender :bodyを追加しました。(プルリクエスト / 詳細)

5 Action Mailer

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

5.1 注目すべき変更

  • 37 Signalsのmail_view gemに基づいたメーラープレビュー機能を追加しました。(コミット)

  • Action Mailerメッセージの生成を計測するためのインストゥルメントを追加しました。メッセージの生成にかかる時間がログに記録されます。(プルリクエスト)

6 Active Record

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

6.1 削除

  • SchemaCacheの以下のメソッドに対する非推奨のnilパラメータを削除しました: primary_keystablescolumnscolumns_hash

  • ActiveRecord::Migrator#migrateからブロックフィルタを削除しました。

  • ActiveRecord::Migratorから非推奨のStringコンストラクタを削除しました。

  • 呼び出し可能なオブジェクトを渡さずにscopeを使用する非推奨の使用を削除しました。

  • transaction_joinable=を非推奨とし、begin_transaction:joinableオプションを使用するようにしました。

  • decrement_open_transactionsを非推奨としました。

  • increment_open_transactionsを非推奨としました。

  • PostgreSQLAdapter#outside_transaction?メソッドを非推奨としました。代わりに#transaction_open?を使用してください。

  • ActiveRecord::Fixtures.find_table_nameを非推奨とし、ActiveRecord::Fixtures.default_fixture_model_nameを使用してください。

  • SchemaStatementsからcolumns_for_removeを非推奨としました。

  • SchemaStatements#distinctを非推奨としました。

  • ActiveRecord::TestCaseをRailsのテストスイートに移動しました。このクラスはもはや公開されておらず、内部のRailsテストにのみ使用されます。

  • 関連付けにおける非推奨オプション:restrictのサポートを削除しました。

  • 関連付けにおける非推奨なdelete_sqlinsert_sqlfinder_sqlcounter_sqlオプションのサポートを削除しました。

  • Columnから非推奨なtype_cast_codeメソッドを削除しました。

  • ActiveRecord::Base#connectionメソッドの非推奨警告を削除しました。クラス経由でアクセスしてください。

  • auto_explain_threshold_in_secondsの非推奨警告を削除しました。

  • Relation#countから非推奨の:distinctオプションを削除しました。

  • partial_updatespartial_updates?partial_updates=メソッドを非推奨としました。

  • scopedメソッドを非推奨としました。

  • default_scopes?メソッドを非推奨としました。

  • 4.0で非推奨となった暗黙の結合参照を削除しました。

  • activerecord-deprecated_findersを依存関係から削除しました。 詳細については、gemのREADMEを参照してください。

  • implicit_readonlyの使用を削除しました。readonlyメソッドを使用して、レコードをreadonlyとして明示的にマークしてください。 (プルリクエストを参照してください)

6.2 廃止予定

  • 使用されていないquoted_locking_columnメソッドを廃止しました。

  • ConnectionAdapters::SchemaStatements#distinctを廃止しました。 インターナルで使用されなくなったためです。(プルリクエストを参照してください)

  • rake db:test:*タスクを廃止しました。テストデータベースは自動的に管理されるようになりました。 railtiesのリリースノートを参照してください。(プルリクエストを参照してください)

  • 使用されていないActiveRecord::Base.symbolized_base_classActiveRecord::Base.symbolized_sti_nameを廃止しました。 代替方法はありません。コミットを参照してください。

6.3 注目すべき変更点

  • デフォルトスコープは、チェーンされた条件によって上書きされなくなりました。

この変更前は、モデルでdefault_scopeを定義すると、同じフィールドのチェーンされた条件によって上書きされました。これからは、他のスコープと同様にマージされます。詳細はこちら

  • ActiveRecord::Base.to_paramを追加し、モデルの属性またはメソッドから派生した便利な「pretty」URLを提供します。 (プルリクエストを参照してください)

  • ActiveRecord::Base.no_touchingを追加し、モデルのタッチを無視することができます。 (プルリクエストを参照してください)

  • MysqlAdapterMysql2Adapterのブール型キャストを統一しました。 type_casttrueに対して1を返し、falseに対して0を返します。(プルリクエストを参照してください)

  • .unscopeは、default_scopeで指定された条件を削除します。(コミットを参照してください)

  • 既存の名前付きwhere条件を上書きするActiveRecord::QueryMethods#rewhereを追加しました。(コミットを参照してください)

  • ActiveRecord::Base#cache_keyを拡張し、最も高いタイムスタンプ属性のリストをオプションとして受け取るようにしました。(コミットを参照してください)

  • ActiveRecord::Base#enumを追加し、値がデータベース内の整数にマップされ、名前でクエリできる列挙型属性を宣言できるようにしました。(コミットを参照してください)

  • JSON値を書き込む際に型キャストするようにしました。これにより、データベースから読み取る値と一貫性があります。(プルリクエストを参照してください)

  • hstore値を書き込む際に型キャストするようにしました。これにより、データベースから読み取る値と一貫性があります。 (コミットを参照してください)

  • サードパーティのジェネレータでnext_migration_numberにアクセスできるようにしました。 (プルリクエストを参照してください)

  • update_attributesを呼び出す際に、nilの引数が渡された場合には必ずArgumentErrorをスローするようになりました。具体的には、渡された引数がstringify_keysに応答しない場合にエラーがスローされます。 (プルリクエストを参照してください)

  • CollectionAssociation#first/#last(例:has_many)は、コレクション全体をロードするのではなく、LIMITを使用して結果を取得するクエリを使用します。 (プルリクエストを参照してください)

  • Active Recordモデルクラスのinspectは、新しい接続を初期化しません。つまり、データベースが存在しない場合にinspectを呼び出しても例外が発生しなくなります。 (プルリクエストを参照してください)

  • countのカラム制限を削除し、SQLが無効な場合にはデータベースが例外を発生させるようにしました。 (プルリクエストを参照してください)

  • Railsは、逆の関連を自動的に検出するようになりました。関連の:inverse_ofオプションを設定しない場合、Active Recordはヒューリスティックに基づいて逆の関連を推測します。 (プルリクエストを参照してください)

  • ActiveRecord::Relationでエイリアスのある属性を処理するようにしました。シンボルキーを使用する場合、Active Recordはエイリアスのある属性名をデータベースで使用される実際の列名に変換します。 (プルリクエストを参照してください)

  • フィクスチャファイルのERBは、メインオブジェクトのコンテキストで評価されなくなりました。複数のフィクスチャで使用されるヘルパーメソッドは、ActiveRecord::FixtureSet.context_classに含まれるモジュールで定義する必要があります。 (プルリクエストを参照してください)

  • RAILS_ENVが明示的に指定されている場合、テストデータベースの作成や削除は行いません。 (プルリクエストを参照してください)

  • Relationにはもはや#map!#delete_ifなどの変更メソッドがありません。これらのメソッドを使用する前に、#to_aを呼び出してArrayに変換してください。 (プルリクエストを参照してください)

  • find_in_batchesfind_eachResult#each、およびEnumerable#index_byは、サイズを計算できるEnumeratorを返すようになりました。(プルリクエスト)

  • scopeenum、および関連付けは、"危険な"名前の競合時に例外を発生させるようになりました。(プルリクエストプルリクエスト)

  • secondからfifthメソッドは、firstファインダーと同様に動作します。(プルリクエスト)

  • touchafter_commitおよびafter_rollbackコールバックを発火するようになりました。(プルリクエスト)

  • sqlite >= 3.8.0で部分インデックスを有効にしました。(プルリクエスト)

  • change_column_nullをrevertibleにしました。(コミット)

  • マイグレーション後のスキーマダンプを無効にするフラグを追加しました。新しいアプリケーションのプロダクション環境ではデフォルトでfalseに設定されています。(プルリクエスト)

7 Active Model

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

7.1 廃止予定

  • Validator#setupを廃止しました。これはバリデータのコンストラクタで手動で行う必要があります。(コミット)

7.2 注目すべき変更

  • ActiveModel::Dirtyreset_changesおよびchanges_appliedという新しいAPIメソッドを追加しました。これらは変更の状態を制御します。

  • バリデーションを定義する際に複数のコンテキストを指定できるようになりました。(プルリクエスト)

  • attribute_changed?は、属性が与えられた値に変更されたかどうかを確認するためにハッシュを受け入れるようになりました。:fromおよび:toを指定します。(プルリクエスト)

8 Active Support

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

8.1 削除

  • MultiJSONの依存関係を削除しました。その結果、ActiveSupport::JSON.decodeMultiJSONのオプションハッシュを受け入れなくなりました。(プルリクエスト / 詳細はこちら)

  • カスタムオブジェクトをJSONにエンコードするためのencode_jsonフックのサポートを削除しました。この機能はactivesupport-json_encoder gemに抽出されました。(関連するプルリクエスト / 詳細はこちら)

  • 廃止予定のActiveSupport::JSON::Variableを削除しました。

  • 廃止予定のString#encoding_aware?コア拡張(core_ext/string/encoding)を削除しました。

  • 廃止予定のModule#local_constant_namesModule#local_constantsに置き換えました。

  • 廃止予定のDateTime.local_offsetDateTime.civil_from_formatに置き換えました。

  • 廃止予定のLoggerコア拡張(core_ext/logger.rb)を削除しました。

  • 廃止予定のTime#time_with_datetime_fallbackTime#utc_time、およびTime#local_timeTime#utcおよびTime#localに置き換えました。

  • 廃止予定のHash#diffを削除しました。

  • 廃止予定のDate#to_time_in_current_zoneDate#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フィルタの場合は#beforeを使用)。

  • デフォルトの不規則な単数形から複数形への変換ルールである'cow' => 'kine'を削除しました。(コミット)

8.2 廃止予定

8.3 注目すべき変更

  • ActiveSupportのJSONエンコーダーは、純粋なRubyでのカスタムエンコーディングではなく、JSON gemを利用するように書き直されました。(プルリクエスト / 詳細はこちら)

  • JSON gemとの互換性が向上しました。(プルリクエスト / 詳細はこちら)

  • ActiveSupport::Testing::TimeHelpers#travelおよび#travel_toを追加しました。これらのメソッドは、Time.nowおよびDate.todayをスタブ化して、現在の時刻を指定された時刻または期間に変更します。

  • ActiveSupport::Testing::TimeHelpers#travel_backを追加しました。このメソッドは、traveltravel_toによって追加されたスタブを削除し、現在の時刻を元の状態に戻します。(プルリクエスト)

  • Numeric#in_millisecondsを追加しました。例えば、1.hour.in_millisecondsのように使用することで、getTime()のようなJavaScript関数に渡すことができます。(コミット)

  • Date#middle_of_dayDateTime#middle_of_dayTime#middle_of_dayメソッドを追加しました。また、middaynoonat_middayat_noonat_middle_of_dayをエイリアスとして追加しました。(プルリクエスト)

  • Date#all_week/month/quarter/yearを追加し、日付の範囲を生成するためのメソッドを追加しました。(プルリクエスト)

  • Time.zone.yesterdayTime.zone.tomorrowを追加しました。(プルリクエスト)

  • String#remove(pattern)を追加しました。これは、String#gsub(pattern,'')の一般的なパターンの省略形です。(コミット)

  • Hash#compactHash#compact!を追加し、値がnilの要素をハッシュから削除するためのメソッドを追加しました。(プルリクエスト)

  • blank?present?はシングルトンを返すように変更されました。(コミット)

  • 新しいI18n.enforce_available_localesのデフォルト設定をtrueにしました。これにより、I18nは渡されたすべてのロケールがavailable_localesリストに宣言されている必要があることを確認します。(プルリクエスト)

  • Module#concerningを導入しました。これは、クラス内で責任を分離するための自然で簡単な方法です。(コミット)

  • Object#presence_inを追加しました。これにより、許可されたリストに値を追加することが簡単になります。(コミット)

9 クレジット

Railsへの多くの時間を費やした多くの人々に感謝します。Railsが安定かつ堅牢なフレームワークになったのは、彼らのおかげです。Railsへの貢献者の完全なリストをご覧ください。彼ら全員に敬意を表します。

フィードバック

このガイドの品質向上にご協力ください。

タイポや事実の誤りを見つけた場合は、ぜひ貢献してください。 開始するには、ドキュメントへの貢献セクションを読んでください。

不完全なコンテンツや最新でない情報も見つかるかもしれません。 メインのドキュメントに不足しているドキュメントを追加してください。 修正済みかどうかは、まずEdge Guidesを確認してください。 スタイルと規約については、Ruby on Rails Guides Guidelinesを確認してください。

修正すべき点を見つけたが、自分で修正できない場合は、 問題を報告してください

そして最後に、Ruby on Railsのドキュメントに関するあらゆる議論は、公式のRuby on Railsフォーラムで大歓迎です。