Ruby on Rails 4.2 リリースノート

Rails 4.2の注目ポイント

本リリースノートでは、主要な変更についてのみ説明します。ここに紹介されていない機能、バグ修正、変更の詳細についてはGitHubにあるRailsメインリポジトリの コミットリスト を参照してください。

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

既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。Railのバージョンが4.1に達していない場合は、まずアプリケーションをRails 4.1にアップグレードし、アプリケーションが期待どおりに動作することを確認してからRails 4.2にアップグレードしてください。アップグレードの際に注意すべき点のリストについては、Ruby on Rails アップグレードガイドを参照してください。

2 主要な変更

2.1 Active Job

Active Jobとは、Rails 4.2から採用された新しいフレームワークです。Active Jobは、ResqueDelayed JobSidekiqなど、さまざまなクエリシステムの最上位に位置するものです。

Active Job APIを使用して記述されたジョブは、Active Jobがサポートするどのクエリシステムでもアダプタを介して実行できます。Active Jobは、ジョブを直ちに実行できるインラインランナー (inline runner) として最初から構成済みです。

ジョブの引数にActive Recordオブジェクトを与えたくなることはよくあります。Active Jobでは、オブジェクト参照をURI (uniform resource identifiers) として渡します。オブジェクト自身をマーシャリングしません。このURIは、Railsに新しく導入されたGlobal IDライブラリによって生成され、ジョブはこれを元にオブジェクトを参照します。Active Recordオブジェクトをジョブの引数として渡すと、内部的には単にGlobal IDが渡されます。

たとえば、trashableというActive Recordオブジェクトがあるとすると、以下のようにシリアライズをまったく行わずにジョブに引き渡すことができます。

class TrashableCleanupJob < ActiveJob::Base
  def perform(trashable, depth)
    trashable.cleanup(depth)
  end
end

詳細については、Active Jobの基礎を参照してください。

2.2 メールの非同期処理

今回のリリースで、Action MailerはActive Jobの最上位に配置され、deliver_laterメソッドを使用してジョブキューからメールを送信できるようになりました。これにより、キューを非同期 (asynchronous) に設定すればコントローラやモデルの動作がキューによってブロックされなくなりました (ただしデフォルトのインラインキューではコントローラやモデルの動作はブロックされます)。

deliver_nowメソッドを使用すれば、メールを直ちに送信できます。

2.3 Adequate Record

Adequate Recordとは、Active Recordの性能を向上させるさまざまな改良の総称であり、いわゆるfindfind_by呼び出し、および一部の関連付けクエリの動作速度を最大2倍に向上させます。

この改善は、よく用いられるSQLクエリを準備済みのSQL文 (prepared statement) としてキャッシュし、同様の呼び出しが発生した場合にそれを使い回すことによって行っています。これにより、以後の呼び出しでのクエリ生成作業の大半がスキップされるようになります。詳細については、Aaron Pattersonのブログ記事を参照してください。

Active Recordは、サポートされている動作に対してこのAdequate Recordを自動的に適用するので、コードや設定の変更など開発者が何かを行う必要はありません。Adequate Recordでサポートされている動作の例を以下に示します。

Post.find(1)  # 最初の呼び出しで準備済みSQL文が生成およびキャッシュされる
Post.find(2)  # キャッシュされた準備済みSQL文は以後の呼び出しで再利用される

Post.find_by_title('first post')
Post.find_by_title('second post')

post.comments
post.comments(true)

上の例で、メソッド呼び出しで渡された値そのものは準備済みSQL文のキャッシュに含まれていない点にご注目ください。全体をキャッシュしているのではなく、キャッシュされたSQL文が値のプレースホルダーとなっており、値だけ差し替えられている点が重要です。

以下のような場合にはキャッシュは使用されません。

  • モデルにデフォルトスコープが設定されている
  • モデルで単一テーブル継承 (STI) が使用されている
  • findで (単一のidではなく) idのリストを検索する。例:
  # キャッシュされない
  Post.find(1, 2, 3)
  Post.find([1,2])
  • find_byでSQLフラグメントを使用している
  Post.find_by('published_at < ?', 2.weeks.ago)

2.4 Web Console gem

Rails 4.2で新規生成したアプリケーションにはデフォルトでWeb Console gemが含まれるようになりました。Web Console gemはすべてのエラーページに対話操作可能なRubyコンソールを追加し、consoleビューとコントローラヘルパーメソッドを提供します。

エラーページで対話的コンソールが利用できるようになったことで、例外が発生したコンテキストで自由にコードを実行できるようになりました。consoleヘルパーは、画面出力が完了した最終的な状態のコンテキストで対話的コンソールを起動します。このヘルパーは、どのビューやコントローラからでも自由に呼び出すことができます。

2.5 外部キーのサポート

マイグレーション用DSLで外部キーの追加・削除がサポートされました。今後は外部キーもschema.rbにダンプされます。現時点では、外部キーがサポートされるのはmysqlmysql2、およびpostgresqlアダプタのみです。

# `authors.id`を参照する`articles.author_id`への外部キーを追加する
add_foreign_key :articles, :authors

# `users.lng_id`を参照する`articles.author_id`への外部キーを追加する
add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"

# `accounts.branch_id`の外部キーを削除する
remove_foreign_key :accounts, :branches

# `accounts.owner_id`の外部キーを削除する
remove_foreign_key :accounts, column: :owner_id

完全な説明については、APIドキュメントの add_foreign_key および remove_foreign_key を参照してください。

3 非互換性

前のバージョンで非推奨に指定されていた機能が削除されました。今回のリリースで新たに非推奨指定された機能については個別のコンポーネントの情報を参照してください。

以下の変更については、アップグレード時に対応が必要となることがあります。

3.1 renderに文字列の引数を与えた場合の挙動の変更

以前は、コントローラのアクションでrender "foo/bar"を呼び出すことはrender file: "foo/bar"を呼び出すことと同等でした。この動作はRails 4.2から変更され、render template: "foo/bar"と同等になりました。ファイルを指定したい場合は明示的に(render file: "foo/bar")と書いてください。

3.2 respond_withとクラスレベルのrespond_toの扱いについて

respond_withと、これに対応するクラスレベルのrespond_toresponders gemに移動されました。この機能を使用したい場合は、Gemfilegem 'responders', '~> 2.0'を追記してください。

# app/controllers/users_controller.rb

class UsersController < ApplicationController
  respond_to :html, :json

  def show
    @user = User.find(params[:id])
    respond_with @user
  end
end

インスタンスレベルでのrespond_toは影響を受けません。

# app/controllers/users_controller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    respond_to do |format|
      format.html
      format.json { render json: @user }
    end
  end
end

3.3 rails serverのデフォルトホスト

Rackの変更 により、rails serverコマンドを実行した際のデフォルトのホストが0.0.0.0からlocalhostに変更されました。この変更は標準的なローカルでの開発ワークフローにほとんど影響を与えないはずです。http://127.0.0.1:3000 および http://localhost:3000 の動作はどちらも以前と同じであるからです。

ただし、今回の変更により、別のPCからRailsサーバーへのアクセスは以前と同じようにはできなくなります。たとえば、development環境が仮想マシン上にあり、ホストマシンからこのdevelopment環境にアクセスする場合などがこれに該当します。 このような場合、サーバーを起動する際にrails server -b 0.0.0.0とすることで、以前と同じ動作を再現できます。

以前の動作に戻す場合は、必ずファイアウォールを適切に設定し、自社ネットワーク内の信頼できるPCだけが開発用サーバーにアクセスできるようにしてください。

3.4 HTMLサニタイザ

HTMLサニタイザはLoofahNokogiriをベースにした、より新しく堅固な実装に置き換えられました。新しいサニタイザはより安全で、かつ強力で柔軟性に富んでいます。

新しいアルゴリズムが採用されたことにより、特定の汚染された入力をサニタイズした結果が従来と異なる場合があります。

従来のサニタイザと完全に同じ結果を得たい場合は、rails-deprecated_sanitizer gemを Gemfileに追加することで従来と同じ結果を得られます。このgemはオプトイン (opt-in: 自らの責任で選ぶこと) であるため、非推奨の警告を表示しません。

rails-deprecated_sanitizerのサポートはRails 4.2でしか行われないことにご注意ください。Rails 5.0ではメンテナンスされません。

新しいサニタイザの変更点の詳細については、このブログ記事を参照してください。

3.5 assert_select

assert_selectNokogiriベースで実装されました。 これにより、以前は有効であったセレクタの一部がサポートされなくなりました。アプリケーションでこれらを使用している場合は、アプリケーションを変更する必要があります。

  • 属性セレクタの値に英文字以外の文字が含まれる場合は、値を引用符で囲む必要が生じることがあります

    # 以前の動作
    a[href=/]
    a[href$=/]
    
    # 現在の動作
    a[href="/"]
    a[href$="/"]
    
  • 要素のネストが正しくないHTMLを含むHTMLソースから生成されたDOMでは結果が異なることがあります。

    例:

    # content: <div><i><p></i></div>
    
    # 以前の動作
    assert_select('div > i')  # => true
    assert_select('div > p')  # => false
    assert_select('i > p')    # => true
    
    # 現在の動作
    assert_select('div > i')  # => true
    assert_select('div > p')  # => true
    assert_select('i > p')    # => false
    
  • 選択したデータに実体参照文字が含まれている場合、比較のために選択された値は以前は実体参照文字のまま (AT&amp;Tなど)でしたが、現在は 実体参照を評価してから比較するようになりました(AT&Tなど)。

    # <p>AT&amp;T</p>の内容の扱い
    
    # 以前の動作
    assert_select('p', 'AT&amp;T')  # => true
    assert_select('p', 'AT&T')      # => false
    
    # 現在の動作
    assert_select('p', 'AT&T')      # => true
    assert_select('p', 'AT&amp;T')  # => false
    

4 Railties

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

4.1 削除されたもの

  • アプリケーションのジェネレータから--skip-action-viewオプションが削除されました。 (Pull Request)

  • rails applicationコマンドは削除されました。他のコマンドへの置き換えは行われていません。 (Pull Request)

4.2 非推奨

  • production環境でconfig.log_levelを未設定のままにすることが非推奨になりました。 (Pull Request)

  • rake test:allが非推奨になりました。現在はrake testの方が推奨されます(これによりtestフォルダ以下のテストがすべて実行されます)。 (Pull Request)

  • rake test:all:dbが非推奨になりました。現在はrake test:dbが推奨されます。 (Pull Request)

  • Rails::Rack::LogTailerは非推奨になりました。代替はありません。 (Commit)

4.3 主な変更点

  • web-consoleがデフォルトのアプリケーションのGemfileに導入されました。 (Pull Request)

  • モデル関連付けをおこなうジェネレータにrequiredオプションが追加されました。 (Pull Request)

  • カスタム設定オプションを定義する時に使用するx名前空間が導入されました。

    # config/environments/production.rb
    config.x.payment_processing.schedule = :daily
    config.x.payment_processing.retries  = 3
    config.x.super_debugger              = true
    

    これらのオプションは、以下のようにconfigurationオブジェクト全体で使用できます。

    Rails.configuration.x.payment_processing.schedule # => :daily
    Rails.configuration.x.payment_processing.retries  # => 3
    Rails.configuration.x.super_debugger              # => true
    

    (Commit)

  • 現在の環境設定を読み込むためのRails::Application.config_forが導入されました。

    # config/exception_notification.yml:
    production:
      url: http://127.0.0.1:8080
      namespace: my_app_production
    development:
      url: http://localhost:3001
      namespace: my_app_development
    
    # config/production.rb
    Rails.application.configure do
      config.middleware.use ExceptionNotifier, config_for(:exception_notification)
    end
    

    (Pull Request)

  • アプリケーションのジェネレータに--skip-turbolinksオプションが導入されました。これは生成時にTurbolinksを統合しないためのオプションです。 (Commit)

  • bin/setupスクリプトが導入されました。これはアプリケーションの初期設定時に設定を自動化するためのコードの置き場所となります。 (Pull Request)

  • development環境において、config.assets.digestのデフォルト値がtrueに変更されました。 (Pull Request)

  • rake notesに新しい拡張子を登録するためのAPIが導入されました。 (Pull Request)

  • Railsテンプレートで使用するafter_bundleコールバックが導入されました。 (Pull Request)

  • Rails.gem_versionメソッドが導入されました。これはGem::Version.new(Rails.version)を簡単に得るためのものです。 (Pull Request)

5 Action Pack

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

5.1 削除されたもの

  • respond_with とクラスレベルでのrespond_toがRailsから外され、responders gem (version 2.0) に移されました。引き続きこの機能を使う場合は、 Gemfileにgem 'responders', '~> 2.0'を追加してください。 (Pull Request詳細)

  • 非推奨のAbstractController::Helpers::ClassMethods::MissingHelperErrorが削除されました。今後はAbstractController::Helpers::MissingHelperErrorを使用してください。 (Commit)

5.2 非推奨

  • *_pathヘルパーでonly_pathオプションを使用することが非推奨になりました。 (Commit)

  • assert_tagassert_no_tagfind_tagfind_all_tagが非推奨になりました。今後はassert_selectを使用してください。 (Commit)

  • ルーティングの:toオプションで、#という文字を含まないシンボルや文字列のサポートが非推奨になりました。

    get '/posts', to: MyRackApp    => (変更不要)
    get '/posts', to: 'post#index' => (変更不要)
    get '/posts', to: 'posts'      => get '/posts', controller: :posts
    get '/posts', to: :index       => get '/posts', action: :index
    

    (Commit)

  • URLヘルパー内において、ハッシュのキーに文字列を使用することが非推奨になりました。例:

    # 良くない例
    root_path('controller' => 'posts', 'action' => 'index')
    
    # 良い例
    root_path(controller: 'posts', action: 'index')
    

    (Pull Request)

5.3 主な変更点

  • *_filterに関するメソッド群をドキュメントから削除しました。これらのメソッドの使用は推奨されていません。今後は*_actionを使用するようにしてください。

    after_filter          => after_action
    append_after_filter   => append_after_action
    append_around_filter  => append_around_action
    append_before_filter  => append_before_action
    around_filter         => around_action
    before_filter         => before_action
    prepend_after_filter  => prepend_after_action
    prepend_around_filter => prepend_around_action
    prepend_before_filter => prepend_before_action
    skip_after_filter     => skip_after_action
    skip_around_filter    => skip_around_action
    skip_before_filter    => skip_before_action
    skip_filter           => skip_action_callback
    

    アプリケーションがこれらのメソッドに依存している場合は、*_actionに置き換える必要があります。これらのメソッドは今後非推奨になり、最終的にはRailsから削除される予定です。

    (Commit 12)

  • render nothing: true、およびbodyをnilにしたレンダリングを行った場合にレスポンスのbodyを埋めていたスペース文字1つが追加されなくなりました。 (Pull Request)

  • テンプレートのダイジェストを自動的にETagsに含めるようになりました。 (Pull Request)

  • URLヘルパーに渡されるセグメントが自動的にエスケープされるようになりました。(Commit)

  • グローバルに使用してよいパラメータを指定するためのalways_permitted_parametersが導入されました。この設定のデフォルト値は['controller', 'action']です。 (Pull Request)

  • RFC 4791に基づいたMKCALENDARというHTTPメソッドを追加しました。 (Pull Request)

  • *_fragment.action_controller通知にペイロード上のコントローラ名とアクション名が含まれるようになりました。 (Pull Request)

  • ルーティング探索があいまい一致した場合のRouting Errorページの表示が改良されました。 (Pull Request)

  • CSRFによる失敗のログ出力を無効にするオプションが追加されました。 (Pull Request)

  • Railsが静的なアセットを送信するように設定されている場合、ブラウザがgzip圧縮ファイルをサポートし、かつgzipファイル (.gz) がサーバーのディスク上にあれば、アセットのgzip圧縮がサポートされるようになりました。 アセットパイプラインは、圧縮可能なすべてのアセットから.gzファイルをデフォルトで生成するようになりました。gzip圧縮されたファイルを送信することで、通信量が最小化され、アセットへのリクエストが高速化されます。Railsがproduction環境でアセットを提供する場合は、必ずCDN を有効にしてください。 (Pull Request)

  • 結合テストの中でprocessヘルパーを呼び出すとき、パスの冒頭にスラッシュ ('/') が必要になりました。以前は省略することができましたが、これは内部実装による副作用であり、意図的な機能ではありません。例:

    test "list all posts" do
      get "/posts"
      assert_response :success
    end 
    

6 Action View

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

6.1 非推奨

  • AbstractController::Base.parent_prefixesは非推奨になりました。ビューの検索対象を変更したい場合はAbstractController::Base.local_prefixesをオーバーライドしてください。 (Pull Request)

  • ActionView::Digestor#digest(name, format, finder, options = {})は非推奨になりました。 今後、引数は1つのハッシュとして渡す必要があります。 (Pull Request)

6.2 主な変更点

  • render "foo/bar"が拡張され、render file: "foo/bar"ではなくrender template: "foo/bar"を実行するようになりました。 (Pull Request)

  • フォームヘルパーが変更され、インラインCSSを持つ<div>要素が隠しフィールドの周辺で生成されなくなりました。 (Pull Request)

  • #{partial_name}_iterationという特殊なローカル変数が導入されました。このローカル変数は、コレクションのレンダリング時にパーシャルを使用します。これにより、#index#size#first?last?メソッドを使って現在のイテレート中の状態にアクセスできるようになりました。 (Pull Request)

  • プレースホルダの国際化 (I18n) がlabelの国際化と同じルールに従うようになりました。 (Pull Request)

7 Action Mailer

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

7.1 非推奨

  • Action Mailerの*_pathヘルパーが非推奨になりました。今後は必ず*_urlヘルパーを使用してください。 (Pull Request)

  • deliverdeliver!が非推奨になりました。今後はdeliver_nowdeliver_now!を使用してください。 (Pull Request)

7.2 主な変更点

  • link_tourl_forを使って絶対パスのURLを生成するとき、only_path: falseを渡す必要がなくなりました。 (Commit)

  • deliver_laterが導入されました。これは、アプリケーション内キューにジョブを流し込み、メールを非同期配信します。 (Pull Request)

  • show_previews設定オプションが追加されました。これはdevelopment環境の外でメイラーをプレビューできるようにするためのものです。 (Pull Request)

8 Active Record

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

8.1 削除されたもの

  • cache_attributesおよびその同類が削除されました。すべての属性は常にキャッシュされるようになりました。 (Pull Request)

  • 非推奨のActiveRecord::Base.quoted_locking_columnメソッドが削除されました。 (Pull Request)

  • 非推奨のActiveRecord::Migrator.proper_table_nameが削除されました。今後はActiveRecord::Migrationproper_table_nameインスタンスメソッドを代りに使用してください。 (Pull Request)

  • 未使用の:timestampタイプが削除されました。今後は常に透過的に:datetimeにエイリアスされるようになります。これにより、XMLシリアライズなどでカラムの種類がActive Recordの外に送信された場合の不整合が修正されます。 (Pull Request)

8.2 非推奨

  • after_commitafter_rollback内でのエラーの抑制が非推奨になりました。 (Pull Request)

  • has_many :through アソシエーションにおけるカウンタキャッシュの自動検知サポートが非推奨になりました (元々壊れていました)。今後は、has_many関連付けやbelongs_to関連付けでレコード全体を手動でカウンタキャッシュする必要があります。 (Pull Request)

  • .find.exists?にActive Recordオブジェクトを渡すことは非推奨になりました。最初にオブジェクトのidを呼び出すべきです。 (Commit 12)

  • PostgreSQLで開始値を除外する範囲値に対する (不十分な) サポートが非推奨になりました。現在はPostgreSQLのRangeをRubyのRangeクラスにマップしています。ただし、RubyのRangeクラスでは開始値が外せないため、この方法は完全には実現できません。

    現時点における、開始値を増分 (increment) する解決方法は正しくないため、非推奨になりました。増分の方法が不明なサブタイプ (例: #succは増分方法が未定義) については、開始値を除外する範囲指定によってArgumentErrorが発生します。 (Commit)

  • 接続が行われていない状態でのDatabaseTasks.load_schemaの呼び出しが非推奨になりました。今後はDatabaseTasks.load_schema_currentを使用してください。 (Commit)

  • Replacementを使わずにsanitize_sql_hash_for_conditionsを使用することが非推奨になりました。クエリを発行したり更新する際にはRelationを使用することが、推奨APIとなります。 (Commit)

  • :nullオプションを渡さずにadd_timestampst.timestampsを使用することが非推奨になりました。現在の初期値はnull: trueですが、 Rails 5ではnull: falseに変更される予定です。 (Pull Request)

  • Reflection#source_macroが非推奨になりました。今後Active Recordでの必要性がなくなったため、代替はありません。 (Pull Request)

  • serialized_attributesは非推奨になりました。代替はありません。 (Pull Request)

  • カラムがない場合にcolumn_for_attributenilを返す動作が非推奨になりました。Rails 5.0ではnullオブジェクトが返されるようになる予定です。 (Pull Request)

  • Replacementを使わずに、インスタンスの状態に依存するアソシエーション (例: 引数をとるスコープと共に定義される場合) において、.joins.preload.eager_loadを使うことが非推奨になりました。 (Commit)

8.3 主な変更点

  • create_tableが実行されるとき、SchemaDumperforce: :cascadeを使うようになりました。これにより、外部キーが適切であればスキーマが再読み込みできるようになります。

  • 単独の関連付けに対する:requiredオプションが追加されました。これは関連付けの存在確認の検証 (validation) を定義します。 (Pull Request)

  • ActiveRecord::Dirtyの動作が変更され、変更可能な値 (mutable value)に対する適切な変更を検出するようになりました。 何も変更がないときは、Active Recordモデル内のシリアライズされた要素は保存されなくなります。これらの変更は、PostgreSQLのstringカラムやjsonカラムでも同様に機能します。 (Pull Requests 1, 2, 3)

  • 現在の環境のデータベースを空にするdb:purgeというRakeタスクが導入されました。 (Commit)

  • レコードが正しくないときにActiveRecord::RecordInvalidを返すActiveRecord::Base#validate!が導入されました。 (Pull Request)

  • valid?のエイリアスとしてvalidateが導入されました。 (Pull Request)

  • touchが複数の属性を一度に扱えるようになりました。 (Pull Request)

  • PostgreSQLアダプターでPostgreSQL 9.4+のjsonbデータタイプがサポートされました。 (Pull Request)

  • PostgreSQLとSQLiteアダプターで、String型の初期値から255文字制限が外れました。 (Pull Request)

  • PostgreSQLアダプターのカラム型でcitextがサポートされました。 (Pull Request)

  • PostgreSQLアダプターでユーザ定義のRangeタイプがサポートされました。 (Commit)

  • sqlite3:///some/pathのようなパスは今後絶対システムパスで解決されるようになりました。相対パスが必要な場合は、代りにsqlite3:some/pathのような表記を使用してください (従来sqlite3:///some/pathsome/pathのような相対パスで解決されていましたが、これはRails 4.1で非推奨となっていました)。 (Pull Request)

  • MySQL 5.6以上で小数点以下の秒数サポートが追加されました。 (Pull Request 12)

  • モデルを整えた形式で出力するActiveRecord::Base#pretty_printが追加されました。 (Pull Request)

  • ActiveRecord::Base#reloadの動作がm = Model.find(m.id)と同等になりました。これは、カスタマイズされたSELECTに含まれていた余分な属性が今後は保持されないということを意味しています。 (Pull Request)

  • ActiveRecord::Base#reflectionsが返すハッシュのキーが、シンボルから文字列になりました。(Pull Request)

  • マイグレーションのreferencesメソッドでtypeオプションがサポートされました。外部キーの種類 (:uuidなど) を指定できます。 (Pull Request)

9 Active Model

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

9.1 削除されたもの

  • 非推奨のValidator#setupが削除されました。代替はありません。 (Pull Request)

9.2 非推奨

  • reset_#{attribute}が非推奨になりました。今後はrestore_#{attribute}を使用してください。 (Pull Request)

  • ActiveModel::Dirty#reset_changesが非推奨になりました。今後はclear_changes_informationを使用してください。 (Pull Request)

9.3 主な変更点

  • valid?のエイリアスとして#validateが導入されました。 (Pull Request)

  • ActiveModel::Dirtyrestore_attributesメソッドが導入されました。これは、変更されたが保存されていない (dirty) 属性を以前の値に戻すためのものです。 (Pull Request 1, 2)

  • has_secure_password がデフォルトで空白のパスワードを許容するようになりました (例: 空白スペースのみのパスワード)。 (Pull Request)

  • has_secure_passwordで検証が有効になっている場合は、与えられたパスワードが72文字より少ないかどうかが検証されるようになりました。 (Pull Request)

10 Active Support

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

10.1 削除されたもの

  • 非推奨のNumeric#agoNumeric#untilNumeric#sinceNumeric#from_nowが削除されました。 (Commit)

  • ActiveSupport::Callbacksでの文字列ベースの終端指定子 (terminator) がこれまで非推奨になっていたのが削除されました。 (Pull Request)

10.2 非推奨

  • Kernel#silence_stderrKernel#captureKernel#quietlyが非推奨になりました。代替はありません。 (Pull Request)

  • Class#superclass_delegating_accessorが非推奨になりました。今後はClass#class_attributeを使用してください。 (Pull Request)

  • ActiveSupport::SafeBuffer#prepend! が非推奨となりました。現在は ActiveSupport::SafeBuffer#prepend が同様の振る舞いをします。 (Pull Request)

10.3 主な変更点

  • 順序に依存するテストを明記するためのactive_support.test_orderオプションが導入されました。現在、このオプションの初期値は :sortedで設定されていますが、Rails 5.0から:randomに変更される予定です。 (Commit)

  • ブロック中で明示的にレシーバーを示さなくてもObject#tryObject#try!が使えるようになりました。 (Commit, Pull Request)

  • travel_toテストヘルパーがusecコンポーネントをゼロに切り詰めるように変更されました。 (Commit)

  • オブジェクト自身を返す恒等関数としてObject#itselfが導入されました。 (Commit 1, 2)

  • ブロック中で明示的にレシーバーを示さなくてもObject#with_optionsが使えるようになりました。 (Pull Request)

  • 単語数を指定して文字列を切り詰めるString#truncate_wordsが導入されました。 (Pull Request)

  • ハッシュの値を変更するときの共通のパターンを簡潔にするため、Hash#transform_valuesHash#transform_values!が追加されました。ただし、ハッシュのキーは変更されません。 (Pull Request)

  • アンダースコアなどを含むメソッド名などを英語らしくするhumanizeヘルパーメソッドが、冒頭のアンダースコアを除去するようになりました。 (Commit)

  • Concern#class_methodsが導入されました。Kernel#concernと同様、これはmodule ClassMethodsを置き換えるためのものであり、module Foo; extend ActiveSupport::Concern; endのような冗長な定形コードを避けるためのものです。 (Commit)

  • 自動読み込みやリロードに関する新しいガイドが追加されました。

11 クレジット表記

Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に深く敬意を表明いたします。