Ruby on Rails 3.2 リリースノート

Rails 3.2の注目ポイント

本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GithubのRailsリポジトリにあるコミットリストのchangelogを参照してください。

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

既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 3.1までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 3.2にアップデートしてください。以下の注意点を参照してからアップデートしてください。

1.1 Rails 3.2ではRuby 1.8.7以上が必要

Rails 3.2ではRuby 1.8.7以上が必須です。これより前のバージョンのRubyのサポートは公式に廃止されたため、速やかにRubyをアップグレードすべきです。Rails 3.2はRuby 1.9.2とも互換性があります。

Ruby 1.8.7のp248とp249には、Railsクラッシュの原因となるマーシャリングのバグがあります。なおRuby Enterprise Editionでは1.8.7-2010.02のリリースでこの問題が修正されました。現行のRuby 1.9のうち、Ruby 1.9.1はセグメンテーションフォールト(segfault)で完全にダウンするため利用できません。Railsをスムーズに動かすため、Ruby 1.9.xを使いたい場合は1.9.2 または1.9.3をお使いください。

1.2 Railsのアップグレード方法

  • Gemfileを以下の依存関係に更新します。

    • rails = 3.2.0
    • sass-rails ~> 3.2.3
    • coffee-rails ~> 3.2.1
    • uglifier >= 1.0.3
  • Rails 3.2ではvendor/pluginsが非推奨化されました(Rails 4.0で完全に廃止される予定です)。プラグインをgemに切り出してGemfileに追加することで、プラグインを置き換えられます。プラグインをgem化しないのであれば、プラグインをlib/my_plugin/*などに移動し、config/initializers/my_plugin.rbなどの適切なイニシャライザを追加してください。

  • Railsの設定項目で多数の変更が行われました。config/environments/development.rbで追加しておきたいであろう項目は以下のとおりです。

    # Active Recordモデルのmass assignment保護で例外を発生する
    config.active_record.mass_assignment_sanitizer = :strict
    
    # クエリ送信時のクエリプランのログ出力をより詳細にする
    # (SQLite、MySQL、PostgreSQLで利用可能)
    config.active_record.auto_explain_threshold_in_seconds = 0.5
    

    config/environments/test.rbにも以下のようにmass_assignment_sanitizerを追加する必要があります。

    # Active Recordモデルのmass assignment保護で例外を発生する
    config.active_record.mass_assignment_sanitizer = :strict
    

1.3 エンジンのアップグレード方法

script/railsのコメントより下の行にあるコードを以下に置き換えます。

ENGINE_ROOT = File.expand_path('../..', __FILE__)
ENGINE_PATH = File.expand_path('../../lib/your_engine_name/engine', __FILE__)

require 'rails/all'
require 'rails/engine/commands'

2 Rails 3.2アプリケーションを作成する

# 'rails' RubyGemがインストールされている状態で行うこと
$ rails new myapp
$ cd myapp

2.1 gemに移行する

現在のRailsでは、アプリケーションのルートディレクトリに置かれるGemfileを使って、アプリケーションの起動に必要なgemを指定します。アプリケーション起動時に必要なgemは今後ここで決定されます。Gemfileの処理はBundlerというgemで行われます。今後はBundlerがすべての依存gemをインストールします。依存gemをアプリケーションディレクトリにローカルインストールして、システムのgem(OS環境にあるgem)に依存しないようにすることも可能です(訳注: Rails開発ではこの方法が主流です)。

詳細情報: Bundlerホームページ

2.2 最新のgemを使う

BundlerGemfileのおかげで、専用のbundleコマンド一発でRailsアプリケーションのgemを簡単に安定させることができます。Gitリポジトリから直接bundleしたい場合は--edgeフラグを追加します。

$ rails new myapp --edge

Railsアプリケーションのリポジトリをローカルにチェックアウトしたものがあり、それを使ってアプリケーションを生成したい場合は、--devフラグを追加します。

$ ruby /path/to/rails/railties/bin/rails new m

3 主要な機能

3.1 developmentモードやルーティングの高速化

Rails 3.2のdevelopmentモードが著しく高速になりました。Active Reloadからヒントを得て、ファイルが実際に変更された場合のみクラスを再読み込みするようになりました。アプリが大規模になればなるほど、劇的に高速化します。ルーティングの認識も、新しいJourneyエンジンによって大きく高速化されました。

3.2 クエリの自動explain

Rails 3.2では便利なクエリexplain機能が導入されました。explainはActiveRecord::Relationexplainメソッドで定義され、Arelで生成されます。たとえば、puts Person.active.limit(5).explainのようなコードを実行すると、Arelで生成されるクエリでexplainが行われます。explainは、インデックス化が正しいかどうかをチェックしたり、最適化をさらに進めたりするのに役立ちます。

developmentモードでは、実行完了に1秒以上かかるクエリで自動的にexplainが走るようになります。閾値はもちろん変更可能です。

3.3 ログ出力へのタグ付け

マルチユーザーのアプリケーションやマルチアカウントのアプリケーションを実行する場合、誰が何を行ったかをログでフィルタできると非常に助かります。Active SupportのTaggedLogging機能はまさにこのためのものであり、ログ出力にサブドメインやリクエストidなど任意の項目を追加してアプリケーションのデバッグを支援します。

4 ドキュメント

Rails 3.2以降、iPad/iPhone/Mac/AndroidなどのKindleまたは無料のKindleリーダーアプリで本Railsガイド(英語版)を読めるようになりました。

5 Railties

  • 依存ファイル変更時にのみクラスを再読み込みすることで高速化されました。config.reload_classes_only_on_changefalseに設定することでオフにできます。

  • 新しいアプリケーションでは環境構築ファイルにconfig.active_record.auto_explain_threshold_in_secondsというフラグが置かれます。development.rbでは値が0.5に設定され、production.rbではコメントアウトされています。test.rbでは特に記載はありません。

  • config.exceptions_appが追加されました。これは例外発生時にShowExceptionミドルウェアで呼び出される例外時のアプリケーションを設定します。デフォルトはActionDispatch::PublicExceptions.new(Rails.public_path)です。

  • DebugExceptionsミドルウェアが追加されました。ここにはShowExceptionsミドルウェアから切り出された機能を含みます。

  • rake routesの実行結果にマウント中のエンジンのルーティングも表示されるようになりました。

  • config.railties_orderでrailtiesの読み込み順を以下のように変更できるようになりました。

    config.railties_order = [Blog::Engine, :main_app, :all]
    
  • scaffoldがコンテンツのない場合に「204 No Content for API requests」を返すようになりました。これでjQueryでscaffoldをすぐ使えるようになります。

  • Rails::Rack::Loggerミドルウェアが更新され、config.log_tagsで設定した任意のタグをActiveSupport::TaggedLoggingに適用するようになりました。これにより、サブドメインやリクエストidといったマルチユーザーのproductionアプリケーションで有用なデバッグ情報をログにタグ付けするのが簡単になります。

  • rails newのデフォルトオプションを~/.railsrcで設定できるようになりました。rails newを実行するたびに利用するコマンドラインオプションをホームディレクトリの.railsrc設定ファイルで指定できます。

  • destroyのエイリアスdが追加されました。これはエンジンでも利用できます。

  • scaffoldジェネレータやモデルジェネレータのデフォルトの属性がstringになりました。これにより、rails g scaffold Post title body:text authorのように実行できます。

  • caffoldジェネレータ/モデルジェネレータ/マイグレーションジェネレータで「index」や「uniq」を指定できるようになりました。例:

    rails g scaffold Post title:string:index author:uniq price:decimal{7,2}
    

    上の前者はtitleauthorでインデックスを作成し、後者はuniqueインデックスを作成します。「decimal」などの型ではカスタムオプションも指定できます。上の例ではpriceでdecimalカラムの精度(全体の桁)を7、桁(小数点以下の桁)を2に指定しています。

  • デフォルトのGemfileからturn gemが削除されました。

  • 旧来のrails generate plugin プラグインジェネレータが削除されました。今後はrails plugin newをお使いください。

  • 旧来のconfig.paths.app.controller APIが削除されました。今後はconfig.paths["app/controller"]をお使いください。

5.1 非推奨
  • Rails::Pluginが非推奨化され、Rails 4.0で削除されます。今後はvendor/pluginsにプラグインを追加するのではなく、gemやbundlerでパスやgit dependencyを指定してください。

6 Action Mailer

  • mailのバージョンが2.4.0にアップグレードされました。

  • Rails 3.0で非推奨化されたAction Mailer APIが削除されました。

7 Action Pack

7.1 Action Controller

  • ActionController::BaseのデフォルトモジュールがActiveSupport::Benchmarkableになりました。これにより、以前のようにコントローラのコンテキストで#benchmarkメソッドを利用できるようになりました。

  • caches_page:gzipオプションが追加されました。page_cache_compressionを使ってこのオプションのデフォルト値をグローバルに設定できます。

  • レイアウトの指定に:only条件や:except条件を用いてそれらの条件が失敗した場合にデフォルトのレイアウト(layouts/applicationなど)が使われるようになりました。

    class CarsController
      layout 'single_car', :only => :show
    end
    

    上の例では、:showアクションの場合にlayouts/single_carが使われ、それ以外のアクションではlayouts/applicationlayouts/carsがある場合はそちら)が使われます。

  • form_forが変更され、:asオプションが指定されると#{action}_#{as}をCSSのクラスやidとして用いるようになりました。なお、従来は#{as}_#{action}でした。

  • attr_accessible属性が設定されている場合に、Active RecordモデルのActionController::ParamsWrapperattr_accessible属性のみをラップするようになりました。設定されてない場合は、attribute_namesクラスメソッドが返す属性のみをラップします。これにより、ネストした属性をattr_accessibleに追加した場合のネスト属性のラップ方法が修正されます。

  • コールバックが停止するたびに「Filter chain halted as コールバック名 rendered or redirected」がログに出力されるようになりました。

  • ActionDispatch::ShowExceptionsがリファクタリングされました。このコントローラは例外を表示するかどうかの選択を受け持ちます。コントローラでshow_detailed_exceptions?を上書きすれば、リクエストのエラー時にデバッグ情報を返すべきかどうかを指定できます。

  • レスポンスのbodyが空の場合にレスポンダが「204 No Content for API requests」を返すようになりました(新しいscaffoldと同様です)。

  • ActionController::TestCaseのcookieがリファクタリングされました。今後、テストケースでのcookieの代入には以下のようにcookies[]をお使いください。

    cookies[:email] = 'user@example.com'
    get :index
    assert_equal 'user@example.com', cookies[:email]
    

    cookieをクリアするにはclearを使います。

    cookies.clear
    get :index
    assert_nil cookies[:email]
    

    今後HTTP_COOKIEは出力されません。cookie jarはリクエスト間で保たれるため、テスト時に環境を人為的に操作する場合は、cookie jarの作成前に行う必要があります。

  • send_file:typeが指定されていない場合にファイル拡張子からMIMEタイプを推測するようになりました。

  • PDFやZIPなどのMIMEタイプが追加されました。

  • fresh_when/stale?がオプションハッシュの代わりにレコードを1件取るようになりました。

  • CSRFトークンが見当たらない場合のwarningログレベルが:debugから:warnに変更されました。

  • アセットはリクエストプロトコルをデフォルトで使います。リクエストが利用できない場合はデフォルトで相対を使います。

7.1.1 非推奨
  • 親のレイアウトが明示的に設定されているコントローラでの暗黙のレイアウト探索が非推奨になりました。

    class ApplicationController
      layout "application"
    end
    
    class PostsController < ApplicationController
    end
    

    上の例では、PostsControllerは今後postレイアウトを自動で探索しなくなります。自動探索が必要な場合は、ApplicationControllerlayout "application"を削除するか、PostsControllerで明示的にレイアウトをnilに設定してください。

  • ActionController::UnknownActionが非推奨化されました。今後はAbstractController::ActionNotFoundをお使いください。

  • ActionController::DoubleRenderErrorが非推奨化されました。今後はAbstractController::DoubleRenderErrorをお使いください。

  • アクションが見当たらない場合のmethod_missingが非推奨化されました。今後はaction_missingをお使いください。

  • ActionController#rescue_actionActionController#initialize_template_classActionController#assign_shortcutsが非推奨化されました。

7.2 Action Dispatch

  • ActionDispatch::Responseのデフォルト文字セットを設定するconfig.action_dispatch.default_charsetが追加されました。

  • ActionDispatch::RequestIdミドルウェアが追加されました。これはレスポンスで一意のX-Request-Idヘッダーを有効にしてActionDispatch::Request#uuidメソッドを使えるようにします。これにより、スタック内のエンドツーエンドでのリクエストの追跡や、Syslogのようにさまざまなログが混在しているログで個別のリクエストを特定するのが容易になります。

  • ShowExceptionsミドルウェアで、アプリケーションが失敗した場合の例外レンダリングを受け持つ「例外アプリケーション」を受け取れるようになりました。この例外アプリケーションは起動時にenv["action_dispatch.exception"]の例外のコピーを取り、ステータスコードに書き換えられたPATH_INFOを取ります。

  • rescueのレスポンスを、railtie経由でconfig.action_dispatch.rescue_responsesの指定に沿って設定できるようになりました。

7.2.1 非推奨
  • コントローラレベルでのデフォルト文字セットをせってする機能が非推奨になりました。今後はconfig.action_dispatch.default_charsetをお使いください。

7.3 Action View

  • ActionView::Helpers::FormBuilderbutton_tagのサポートが追加されました。このサポートは、submit_tagのデフォルトの振る舞いを模倣します。

    <%= form_for @post do |f| %>
      <%= f.button %>
    <% end %>
    
  • dateヘルパーが新しく:use_two_digit_numbers => trueオプションを取れるようになりました。これは月や日のselectボックスの数字の頭にゼロを表示します(それぞれの値は変わりません)。たとえば、ISO 8601形式の「2011-08-01」といった日付を表示するのに便利です。

  • フォームで名前空間を指定して、フォーム要素のid属性を一意にできるようになりました。この名前空間属性の名前は、生成されたHTML idの冒頭にアンダースコア付きで追加されます。

    <%= form_for(@offer, :namespace => 'namespace') do |f| %>
      <%= f.label :version, 'Version' %>:
      <%= f.text_field :version %>
    <% end %>
    
  • select_yearのオプション数の上限が1000になりました。:max_years_allowedオプションで上限を独自に設定できます。

  • content_tag_fordiv_forがレコードのコレクションを受け取れるようになりました。受け取る引数をブロックで設定すると、そのレコードを最初の引数としてyieldすることもできるようになりました。x

    @items.each do |item|
      content_tag_for(:li, item) do
         Title: <%= item.title %>
      end
    end
    
    

つまり、上のように書く代わりに、今後は以下のように書けます。

```ruby
content_tag_for(:li, @items) do |item|
  Title: <%= item.title %>
end
```
  • font_pathヘルパーメソッドが追加されました。これはpublic/fontsにあるフォントアセットへのパスを算出します。
7.3.1 非推奨
  • フォーマットやハンドラをrender :templateなどに渡すこと(例: render :template => "foo.html.erb")は非推奨になりました。今後はオプションで直接:handlers:formatsを指定できるようになりました(例: render :template => "foo", :formats => [:html, :js], :handlers => :erb)。

7.4 Sprockets

  • Sprocketsのログ出力を制御するconfig.assets.loggerオプションが設定に追加されました。falseにするとログ出力が止まり、nilにするとデフォルトのRails.loggerが使われます。

8 Active Record

  • 値が「on」や「ON」のbooleanカラムはtrueに型キャストされます。

  • timestampsメソッドでcreated_atカラムやupdated_atカラムが作成されると、デフォルトでnullが許容されなくなります。

  • ActiveRecord::Relation#explainが実装されました。

  • ActiveRecord::Base.silence_auto_explainが実装されました。これを用いると、ブロック内の自動EXPLAINを選択的に無効にできます。

  • 実行の遅いクエリの自動EXPLAINログ出力を実装しました。遅いクエリの判定基準は、新しく追加されたconfig.active_record.auto_explain_threshold_in_secondsパラメータで設定します。パラメータをnilにするとこの機能を無効にできます。デフォルトはdevelopmentモードで0.5、testモードやproductionモードではnilです。Rails 3.2でこの機能をサポートするのは、SQLite、MySQL(mysql2アダプタ)、PostgreSQLです。

  • 単一カラムのキーバリューストアを宣言するActiveRecord::Base.storeが追加されました。

    class User < ActiveRecord::Base
      store :settings, accessors: [ :color, :homepage ]
    end
    
    u = User.new(color: 'black', homepage: '37signals.com')
    u.color                          # アクセサに保存されている属性
    u.settings[:country] = 'Denmark' # アクセサで指定されていない属性でも使える
    
  • マイグレーションを特定のスコープ(対象)に対してのみ実行する機能が追加されました。これを用いて、特定のエンジンのマイグレーションのみを実行できます(取り外す必要のあるエンジンでの変更を元に戻すなど)。

    rake db:migrate SCOPE=blog
    
  • エンジンからコピーしたマイグレーションファイルのスコープが、エンジンの名前で指定されるようになりました(例: 01_create_posts.blog.rb)。

  • ActiveRecord::Relation#pluckメソッドが実装されました。これは背後のテーブルのカラム値を直接配列として返します。シリアライズされた属性でも使えます

    Client.where(:active => true).pluck(:id)
    # SELECT id from clients where active = 1
    
  • 関連付けメソッドの生成は、独立した1つのモジュール内で作成されるようになりました。これはオーバーライドやコンポジションできるようにするためです。たとえばMyModelというクラスがあり、そのモジュールがMyModel::GeneratedFeatureMethodsだとします。Active Modelで定義されたgenerated_attributes_methodsが実行されると、このモジュールはただちにそのモデルクラスにincludeされるので、関連付けメソッドは同じ名前の属性メソッドをオーバーライドします。

  • 一意のクエリを生成するActiveRecord::Relation#uniqActiveRecord::Relation#uniqが追加されました。

    Client.select('DISTINCT name')
    

    上は以下のように書けます。

    Client.select(:name).uniq
    

    リレーションでクエリの一意性を解除することもできます。

    Client.select(:name).uniq.uniq(false)
    
  • SQLite、MySQL、PostgreSQLでインデックスのソート順をサポートしました。

  • :class_nameオプションで文字列の他にシンボルも取れるようになりました。Railsに慣れていない人の混乱を避けるのと、既に文字列とシンボルのどちらも取れる:foreign_keyなどとの一貫性を保つのが目的です。

    has_many :clients, :class_name => :Client # シンボルの最初は大文字にする必要があることに注意
    
  • developmentモードでdb:dropを実行するとtestデータベースも削除されるようになりました。db:createと動作を対称的にするのが目的です。

  • カラムの照合順序(collation)が既に大文字小文字を区別しないようになっている場合、大文字小文字を区別する一意性のバリデーションでMySQLのLOWERの呼び出しを回避するようになりました。

  • transactional fixture(トランザクションを用いるフィクスチャ)で、有効なデータベース接続がすべてリストされるようになりました。これにより、transactional fixtureを無効にしなくても異なる接続でモデルをテストできます。

  • Active Recordに3つのメソッドfirst_or_createfirst_or_create!first_or_initializeが追加されました。これはレコードのfindに使われる引数とcreateに使われる引数が明確なので、従来の動的なfind_or_create_byメソッドより優れたアプローチです。

    User.where(:first_name => "Scarlett").first_or_create!(:last_name => "Johansson")
    
  • Active Recordオブジェクトにwith_lockメソッドが追加されました。これはトランザクションを開始してオブジェクトを(悲観的に)ロックし、ブロックをyieldします。このメソッドはオプションパラメータを1つ取ってlock!に渡します。

    これを用いて以下のように書けるようになりました。

    class Order < ActiveRecord::Base
      def cancel!
        transaction do
          lock!
          # ... ロジックのキャンセル
        end
      end
    end
    

    上は以下のように書けます。

    class Order < ActiveRecord::Base
      def cancel!
        with_lock do
          # ... ロジックのキャンセル
        end
      end
    end
    

8.1 非推奨

  • スレッド内での接続の自動切断が非推奨になりました。以下のようなコードは推奨されません。

    Thread.new { Post.find(1) }.join
    

    以下のようにスレッドの末尾ではデータベース接続を明示的に切断すべきです。

    Thread.new {
      Post.find(1)
      Post.connection.close
    }.join
    

    この変更が必要になるのは、アプリケーションのコード内でスレッドを生成している場合だけです。

  • 5つのメソッド: set_table_nameset_inheritance_columnset_sequence_nameset_primary_keyset_locking_columnが非推奨になりました。今後は代入メソッド(セッターメソッド)をお使いください。たとえばset_table_nameではなく、self.table_name=を使います。

    class Project < ActiveRecord::Base
      self.table_name = "project"
    end
    

    あるいは以下のように独自のself.table_nameメソッドを定義します。

    class Post < ActiveRecord::Base
      def self.table_name
        "special_" + super
      end
    end
    
    Post.table_name # => "special_posts"
    
    

9 Active Model

  • 特定のエラーが1件追加されたかどうかをチェックするActiveModel::Errors#added?が追加されました。

  • strict => trueを指定することで、失敗すると常に例外をraiseする厳密なバリデーションを定義できるようになりました。

  • サニタイザーの振る舞いを置き換える簡易APIとしてmass_assignment_sanitizerオプションが提供されました。サニタイザーの:logger(デフォルト)の振る舞いや:strictの振る舞いもサポートされます。

9.1 非推奨

  • ActiveModel::AttributeMethodsdefine_attr_methodが非推奨になりました。このメソッドは、Active Recordで非推奨になるset_table_nameなどのメソッドでしかサポートされていないためです。

  • Model.model_name.partial_pathが非推奨になりました。今後はmodel.to_partial_pathをお使いください。

10 Active Resource

  • リダイレクトレスポンスの「303 See Other」「307 Temporary Redirect」の振る舞いは、「301 Moved Permanently」「302 Found」のように変わりました。

11 Active Support

  • ActiveSupport:TaggedLoggingが追加されました。これは任意の標準Loggerクラスをラップしてタグ付け機能を提供します。

    Logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
    
    Logger.tagged("BCX") { Logger.info "Stuff" }
    # Logs "[BCX] Stuff"
    
    Logger.tagged("BCX", "Jason") { Logger.info "Stuff" }
    # Logs "[BCX] [Jason] Stuff"
    
    Logger.tagged("BCX") { Logger.tagged("Jason") { Logger.info "Stuff" } }
    # Logs "[BCX] [Jason] Stuff"
    
  • DateTimeDateTimebeginning_of_weekメソッドで、その週の開始日と仮定される日を表すオプション引数を渡せるようになりました。

  • ブロックの実行中にイベントのサブスクリプションを提供するActiveSupport::Notifications.subscribedが追加されました。

  • 新しい3つのメソッドModule#qualified_const_defined?Module#qualified_const_getModule#qualified_const_setが定義されました。これらは標準APIで対応するメソッドと似ていますが、省略なしの定数名(qualified constant name)を取れます。

  • 活用形の#demodulizeを補完する#deconstantizeメソッドが追加されました。これは省略なしの定数名から最も右のセグメントを除去します。

  • safe_constantizeが追加されました。これは文字列を定数化しますが、定数(またはその一部)が存在しない場合に例外をraiseするのではなくnilを返す点が異なります。

  • ActiveSupport::OrderedHashは、Array#extract_options!を利用するとextract可能とマーキングされるようになりました。

  • Array#prependArray#unshiftのエイリアス)とArray#appendArray#<<のエイリアス)が追加されました。

  • Ruby 1.9での空文字の定義がUnicodeホワイトスペースに拡張されました。また、Ruby 1.8では「全角スペース(ideographic space: U`3000)」がホワイトスペースとみなされるようになりました。

  • 活用形を解釈するinflectorが頭字語を扱えるようになりました。

  • 期間を生成するTime#all_dayTime#all_weekTime#all_quarterTime#all_yearが追加されました。

    Event.where(:created_at => Time.now.all_week)
    Event.where(:created_at => Time.now.all_day)
    
  • instance_accessor: falseオプションがClass#cattr_accessorおよび類似のメソッドに追加されました。

  • ActiveSupport::OrderedHashで、#each#each_pairに渡すブロックがパラメータをsplatで受け取る場合の振る舞いが変わりました。

  • developmentモードやtestingモードで使うActiveSupport::Cache::NullStoreが追加されました。

  • ActiveSupport::SecureRandomが削除され、標準ライブラリのSecureRandomに置き換えられました。

11.1 非推奨

  • ActiveSupport::Base64が非推奨になりました。今後はBase64をお使いください。

  • ActiveSupport::Memoizableが非推奨になりました。今後はRuby標準のメモ化パターンをお使いください。

  • Module#synchronizeが非推奨になりました。代替機能はありません。Ruby標準ライブラリのMonitorをお使いください。

  • ActiveSupport::MessageEncryptor#encryptActiveSupport::MessageEncryptor#decryptが非推奨になりました。

  • ActiveSupport::BufferedLogger#silenceが非推奨になりました。特定のログを抑制したい場合は、ログレベルを適切なものに変更してください。

  • ActiveSupport::BufferedLogger#open_logは非推奨になりました。これはそもそもpublicにすべきではありませんでした。

  • ActiveSupport::BufferedLoggerで、ログファイル用のディレクトリを自動作成する振る舞いが非推奨になりました。利用する前にログファイルを置くディレクトリがあることをご確認ください。

  • ActiveSupport::BufferedLogger#auto_flushingが非推奨になりました。今後は背後のファイルハンドルのsyncレベルを設定するか、ファイルシステムを調整してください。今後はFSのキャッシュがflushを制御するようになりました。

    f = File.open('foo.log', 'w')
    f.sync = true
    ActiveSupport::BufferedLogger.new f
    
  • ActiveSupport::BufferedLogger#flushが非推奨になりました。ファイルハンドルでsyncを設定するか、ファイルシステムを調整してください。

12 クレジット表記

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

Rails 3.2リリースノートの編集担当はVijay Devでした。