Rails 3.0は、晩ご飯も作れば洗濯物も畳んでくれる、夢のような製品です。Rails 3.0なしで今までどうやって暮らしていけたのか、不思議で仕方がなくなるでしょう。Rails 3.0は、これまでのRailsバージョンの中でかつてない高みに到達しました。
冗談はともかく、Rails 3.0は実によい仕上がりとなりました。Merbチームが我らがRailsチームに参加したことでもたらされた素晴らしいアイデアがすべて込められています。Merbチームはフレームワークの謎に満ちた内部をスリムかつ高速化し、素敵なAPIを多数もたらしてくれました。Merb 1.xをご存じの方であれば、Rails 3.0にその成果が多数盛り込まれていることがおわかりいただけるはずです。Rails 2.xをご存じの方もきっとRails 3.0を好きになっていただけるでしょう。
多くの機能や改良APIを搭載したRails 3.0は、内部がきれいになったかどうかに関心のない方も夢中になるでしょう。Railsアプリケーション開発者にとって、かつてないほど素晴らしい時期が到来しました。その中からいくつかご紹介します。
そして何よりも、今回私たちは旧APIを非推奨化する際にできるかぎり適切なwarningを表示することを心がけました。つまり、Rails 3に移行するために、既存のアプリケーションの古いコードを今すぐ最新のベストプラクティスにすべて書き換えなくてもよいということです。
これらのリリースノートでは主要なアップグレードを取り扱いますが、細かなバグ修正や変更点については記載しませんのでご注意ください。Rails 3.0は、250人を超える人々による4,000件近いコミットを含みます。すべての変更点をチェックしたい方は、GitHub上のメインRailsリポジトリでコミットリストをご覧ください。
Rails 3のインストール方法は次のとおりです。
# セットアップで必要な場合はsudoを使います $ gem install rails
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 2.3.5までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 3にアップデートしてください。終わったら、以下の変更点にご注意ください。
Rails 3.0ではRuby 1.8.7以上が必須です。これより前のバージョンのRubyのサポートは公式に廃止されたため、速やかにRubyをアップグレードすべきです。Rails 3.0は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はRails 3.0でセグメンテーションフォールト(segfault)で完全にダウンするため利用できません。Railsをスムーズに動かすため、Rails 3でRuby 1.9.xを使いたい場合は1.9.2をお使いください。
Rails 3では、同一プロセス内で複数のRailsアプリケーション実行をサポートするための基礎の一環として、「アプリケーションオブジェクト」という概念が導入されました。1つのアプリケーションオブジェクトには、そのアプリケーション固有の設定がすべて保持されます。しかも、この設定は従来のRailsのconfig/environment.rb
と極めて似通っています。
今後、各Railsアプリケーションはそれに対応するアプリケーションオブジェクトを持たなければなりません。このアプリケーションオブジェクトはconfig/application.rb
で定義されます。既存のアプリケーションをRails 3にアップグレードする場合、このconfig/application.rb
を追加して、config/environment.rb
内の設定を適宜そこに移動しなければなりません。
従来スクリプトの置き場に使われていたscript
ディレクトリは、新しいscript/rails
に置き換えられます。script/rails
は直接実行するものではありませんが、Railsアプリケーションのルートディレクトリで呼び出されたことをrails
コマンドが検知して、代わりにスクリプトを実行します。望ましい用法は以下のとおりです。
$ rails console # script/consoleではない $ rails g scaffold post title:string # script/generate scaffold post title:stringではない
rails --help
を実行すればすべてのオプションを表示できます。
従来のconfig.gem
を用いる方式は廃止され、bundler
とGemfile
を用いる方式に置き換えられました。後述のgemに移行するを参照してください。
アップグレードプロセスを支援するために、Rails Upgradeというプラグインが自動化の一部として作成されました。
このプラグインをインストールしてrake rails:upgrade:check
を実行すれば、アプリ内でアップデートの必要な箇所をチェックできます(アップグレード方法の情報へのリンクも表示されます)。このプラグインは、config.gem
呼び出しに基づいてGemfile
を生成するタスクや、現在のルーティングから新しいルーティングファイルを生成するタスクも提供します。以下を実行すればプラグインを取得できます。
$ ruby script/plugin install git://github.com/rails/rails_upgrade.git
動作例については「Rails Upgradeプラグインが公式化された (英語)」で参照できます。
Rails Upgradeツール以外にも、支援が必要な場合はIRCやGoogleグループのrubyonrails-talkに自分と同じ問題に遭遇した人がおそらくいるでしょう。ぜひアップグレード作業をブログ記事にして、他の人々も知見を得られるようにしましょう。
# 'rails'というRubyGemがインストールされている必要があります。 $ rails new myapp $ cd myapp
今後のRailsでは、アプリケーションのルートディレクトリに置かれるGemfile
を使って、アプリケーションの起動に必要なgemを指定するようになりました。このGemfile
はBundlerというgemによって処理され、依存関係のある必要なgemをすべてインストールします。依存するgemをそのアプリケーションの中にだけインストールして、OS環境にある既存のgemに影響を与えないようにすることもできます。
詳細情報: Bundlerホームページ
Bundler
とGemfile
のおかげで、専用のbundle
コマンド一発でRailsアプリケーションのgemを簡単に安定させることができます。Gitリポジトリから直接bundleしたい場合は--edge
フラグを追加します。
$ rails new myapp --edge
Railsアプリケーションのリポジトリをローカルにチェックアウトしたものがあり、それを使ってアプリケーションを生成したい場合は、--dev
フラグを追加します。
$ ruby /path/to/rails/bin/rails new myapp --dev
Railsのアーキテクチャで6つの大きな変更点が発生しました。
Railtiesが更新され、Railsフレームワーク全体で一貫したプラグインAPIを提供するようになるとともに、ジェネレータやRailsバインディングが完全に書き直されました。これによって、開発者がジェネレータやアプリケーションフレームワークのあらゆる重要なステージに統一的かつ定義済みの方法でフックをかけられるようになりました。
MerbとRailsの主要なマージ作業のひとつが、Railsのコアコンポーネントの密結合を切り離すことでした。この作業が完了したことで、Railsのあらゆるコアコンポーネントが同一のAPIを使うようになりました。これらのAPIはプラグイン開発に利用できます。つまり、作成したプラグインやコアコンポーネントを置き換える(DataMapperやSequelなど)際に、Railsコアコンポーネントからアクセスできるあらゆる機能にアクセスして自由自在に拡張できるようになったということです。
詳しくは「The Great Decoupling」を参照してください。
密結合したコアコンポーネントの切り離し作業の一環として、Active Recordへの結合をAction Packから切り出しました。この作業が完了したことで、新しいORMプラグインではActive Modelインターフェイスを実装するだけでAction Packとシームレスに協調動作できるようになりました。
詳しくは「Make Any Ruby Object Feel Like ActiveRecord」を参照してください。
密結合したコアコンポーネントの切り離し作業として、基底スーパークラスを1つ作成しました。このクラスは、ビューのレンダリングなどを扱うHTTPの記法から分離されています。このAbstractController
クラスを作成したことで、ActionController
やActionMailer
が極めてシンプルになり、これらのライブラリすべてから共通部分が切り出されてAbstract Controllerに移動しました。
詳しくは「Rails Edge Architecture」を参照してください。
Arel(Active Relationとも呼ばれます)がActive Recordの下に配置され、Railsで必須のコンポーネントになりました。Arelは、Active Recordを簡潔にするSQL抽象化を提供し、Active Recordのリレーション機能を支えます。
詳しくは「Why I wrote Arel」を参照してください。
Action Mailerは最初期からモンキーパッチやプリパーサーだらけで、配信エージェントや受信エージェントまであり、さらにソースツリーでTMailをベンダリングしているというありさまでした。Rails 3では、メールに関連するあらゆる機能をMail gemで抽象化しました。こちらでもコードの重複が著しく解消され、Action Mailerとメールパーサーの間に定義可能な境界を作成しやすくなりました。
詳しくは「New Action Mailer API in Rails 3」を参照してください。
Railsツリーのドキュメントが更新されてAPI変更がすべて反映されました。さらに、Rails EdgeガイドにもRails 3.0の変更点を順次反映中です。ただし、guides.rubyonrails.orgの本ガイドについては、安定版Railsのドキュメントのみを含みます(執筆時点では3.0がリリースされるまで2.3.5となります)。
詳しくは「Rails Documentation Projects」を参照してください。
Rails 3では国際化(I18n)のサポートに関して、速度改善が著しい最新のI18n gemなど多くの作業が行われました。
ActiveModel::Translation
やActiveModel::Validations
を含むあらゆるオブジェクトにI18nの振る舞いを追加できます。訳文のerrors.messages
フォールバック機能もあります。詳しくは「Rails 3 I18n changes」を参照してください。
主要なRailsフレームワークの分離作業に伴って、Railtiesも大規模にオーバーホールされ、フレームワーク/エンジン/プラグインをできるだけ楽に拡張できる形で連結しました。
アプリ名.boot
で始まり、他のアプリケーションとのやりとりが今よりもずっと簡単になります。Rails.root/app
以下に置かれるものはすべて読み込みパスに追加されるようになりました。これにより、たとえばapp/observers/user_observer.rb
を作るだけで、設定変更なしでRailsが読み込んでくれます。Rails.config
オブジェクトが提供されます。これは、Railsの膨大な設定オプションをすべて集約する中央リポジトリを提供します。アプリケーション生成時に、test-unit/Active Record/Prototype.js/Gitのインストールをスキップするフラグも渡せるようになりました。また、--dev
フラグも新たに追加されたことで、Railsを指すGemfile
をチェックアウト状態でアプリをセットアップできるようになりました(これはrails
バイナリへのパスで決定されます)。詳しくはrails --help
を参照してください。
Rails 3.0のRailtiesジェネレータでは、基本的に以下のようなさまざまな注意点があります。
rails generate foo
を呼び出すとgenerators/foo_generator
を探索します。Rails.root/lib/templates
にテンプレートのコピーを置くことでテンプレートをオーバーライドできるRails::Generators::TestCase
も提供される: これを用いて独自のジェネレータを作成・テストできますまた、Railtiesジェネレータで生成されるビューについてもいくつかオーバーホールが行われました。
p
タグの代わりにdiv
タグが使われるようになった_form
パーシャルを使うようになったf.submit
が使われるようになった: これは、渡されるオブジェクトのステートに応じて「Create ModelName」または「Update ModelName」を返します最後に、rakeタスクもいくつかの点が拡張されました。
rake db:forward
が追加された: マイグレーションを個別またはグループにまとめてロールフォワードできますrake routes CONTROLLER=x
が追加された: コントローラを1つ指定してルーティングを表示できます。Railtiesで以下が非推奨化されました。
RAILS_ROOT
が非推奨化: 今後はRails.root
を使いますRAILS_ENV
が非推奨化: 今後はRails.env
を使いますRAILS_DEFAULT_LOGGER
が非推奨化: Rails.logger
を使いますPLUGIN/rails/tasks
とPLUGIN/tasks
は今後どのタスクでも読み込まれなくなったので、今後はPLUGIN/lib/tasks
を使わなければなりません。
詳しくは以下を参照してください。
Action Packは内部と外部ともに大きく変更されました。
Action Controllerから一般性の高い部分をAbstract Controllerに切り出して再利用可能なモジュールとし、テンプレートやパーシャルのレンダリング、ヘルパー、訳文、ログ出力など「リクエスト-レスポンス」サイクルのあらゆる要素をどのライブラリからでも利用できるようにしました。この抽象化によって、ActionMailer::Base
はAbstractController
を継承してRails DSLをMail gemでラップするだけで済むようになりました。
Abstract Controllerを導入したことで、Action Controllerのコードをクリーンアップするよい機会となり、コードをシンプルにする部分が抽象化されました。
ただし、Abstract Controllerはユーザー(開発者)が直接使うAPIではない点にご注意ください。日々のRails開発でAbstract Controllerを使うことはありません。
詳しくは「Rails Edge Architecture」を参照してください。
application_controller.rb
にprotect_from_forgery
がデフォルトで含まれるようになりました。cookie_verifier_secret
は非推奨化され、今後はRails.application.config.cookie_secret
で代入されます。また、これはconfig/initializers/cookie_verification_secret.rb
という独自のファイルに移動しました。session_store
はActionController::Base.session
で設定されるようになり、Rails.application.config.session_store
に移動しました。デフォルトはconfig/initializers/session_store.rb
で設定されます。cookies.secure
を用いて、暗号化された値をcookie.secure[:key] => value
でcookieに設定できます。cookies.permanent
を用いて、恒久的な値をcookie.permanent[:key] => value
でcookieハッシュに設定できます。署名済みの値が検証に失敗すると例外がraiseされます。respond_to
ブロック内のformat
呼び出しに、:notice => 'This is a flash message'
や:alert => 'Something went wrong'
を渡せるようになりました。flash[]
ハッシュの動作は従来と同じです。respond_with
メソッドがコントローラに追加されます。これを用いて、込み入ったformat
ブロックをシンプルに書けます。ActionController::Responder
が追加されました。これを用いて、レスポンスを柔軟に生成できます。以下が非推奨化されました。
filter_parameter_logging
が非推奨化されました。今後はconfig.filter_parameters << :password
をお使いください。詳しくは以下を参照してください。
Action DispatchはRails 3.0で新しく追加されました。これはルーティングの明快な実装を新たに提供します。
rack_mount
となりました。これは単独のソフトウェアです。各アプリケーションで定義されるルーティングは、以下のようにApplicationモジュール内で名前空間化されるようになりました。
# 従来 ActionController::Routing::Routes.draw do |map| map.resources :posts end # 今後はこのように書く AppName::Application.routes do resources :posts end
match
メソッドがルーターに追加され、マッチしたルーティングに任意のRackアプリケーションも渡せるようになりました。
constraints
メソッドがルーターに追加され、定義済みの制約を用いてルーターを保護できるようになりました。
scope
メソッドがルーターに追加され、以下のようにさまざまな言語(ロケール)やアクションへのルーティングを名前空間化できるようになりました。
scope 'es' do resources :projects, :path_names => { :edit => 'cambiar' }, :path => 'proyecto' end # /es/proyecto/1/cambiarでeditアクションにアクセスできる
root
メソッドがルーターに追加され、これでmatch '/', :to => path
をショートカットできるようになりました。
マッチにセグメントをオプションとして渡せるようになりました。たとえばmatch "/:controller(/:action(/:id))(.:format)"
の場合、丸かっこで囲まれた各セグメントがオプションになります。
ルーティングをブロックで表現できるようになりました。controller :home { match '/:action' }
のように呼び出せます。
map
コマンドの旧来の書式は、後方互換性レイヤがあることで引き続き使えます。ただし、後方互換性レイヤは3.1リリースで削除される予定です。
以下が非推奨化されました。
/:controller/:action/:id
はコメントアウトされるようになりました。:path_prefix
ルーティングは存在しなくなりました。また、:name_prefix
に渡された値の末尾に自動的に"_"が追加されるようになりました。詳しくは以下を参照してください。
Action Viewヘルパーで大規模な書き直しが行われ、Unobtrusive JavaScript(UJS)フックが実装され、旧来のインラインAJAXコマンドが削除されました。これによって、RailsでヘルパーでUJSフックを実装するときに任意のUJS準拠ドライバを利用できるようになりました。
具体的には、旧来のremote_<メソッド名>
ヘルパーはRailsコアからすべて削除され、Prototype Legacy Helperに移動しました。今後UJSフックをHTML側で取得するには、以下のように:remote => true
を渡します。
form_for @post, :remote => true
上のコードから以下のHTMLが生成されます。
<form action="http://host.com" id="create-post" method="post" data-remote="true">
form_for
やdiv_for
などの、ブロック内のコンテンツを挿入するヘルパーが、以下のように<%=
を使うようになりました。
<%= form_for @post do |f| %> ... <% end %>
今後これと同様の自作ヘルパーは、手動で出力バッファにappendするのではなく、文字列を返すことが期待されます。
それ以外のヘルパー(cache
やcontent_for
など)は、この変更の影響を受けないため、従来同様<%
が必要です。
h(string)
呼び出しでエスケープする必要はもうありません。h(string)
はデフォルトであらゆるビューテンプレートで有効になります。エスケープを解除した(unescaped)文字列が欲しい場合はraw(string)
を呼び出します。f.label :name
とすると:name
の訳文を取り出します。:en.support.select
ではなく:en.helpers.select
と記述すべきです。grouped_collection_select
ヘルパーが追加されました。content_for?
が追加されました。これはレンダリング前のビューにコンテンツが存在するかどうかをチェックします。:value => nil
をフォームヘルパーに渡すと、デフォルト値を使わずにフィールドのvalue
属性をnil
に設定できます。:id => nil
をフォームヘルパーに渡すと、フィールドがid
属性なしでレンダリングされます。image_tag
に:alt => nil
を渡すと、img
タグがalt
属性なしでレンダリングされます。Rails 3.0で新たにActive Modelが導入されました。Active Modelは任意のORMライブラリを抽象化するレイヤを提供し、Active Modelインターフェイスを実装してRailsとやり取りするのに用います。
コアコンポーネント分離作業のひとつは、Active Recordへの結合をAction Packからすべて切り出すことでした。この作業が完了したことで、新しいORMプラグインはすべて、Active Modelインターフェイスを実装するだけでAction Packとシームレスにやりとりできるようになりました。
詳しくはMake Any Ruby Object Feel Like ActiveRecordを参照してください。
バリデーションがActive RecordからActive Modelに移動し、Rail 3のさまざまなORMライブラリで使えるバリデーションのインターフェイスを提供するようになりました。
validates :attribute, options_hash
ショートカットメソッドができました。これによって、あらゆるクラスメソッドのバリデーションに用いるオプションを渡せるようになり、1つのバリデーションメソッドに複数のオプションを渡せるようになりました。
validates
メソッドのオプションは以下のとおりです。
:acceptance => Boolean
:confirmation => Boolean
:exclusion => { :in => Enumerable }
:inclusion => { :in => Enumerable }
:format => { :with => Regexp, :on => :create }
:length => { :maximum => Fixnum }
:numericality => Boolean
:presence => Boolean
:uniqueness => Boolean
Rails 2.3スタイルのバリデーションメソッドはRails 3.0でも引き続きサポートされます。この新しいバリデーションメソッドの設計はモデルに新たなバリデーションを追加するためのものであり、既存APIを置き換えるものではありません。
バリデータオブジェクトを1つ渡すこともできます。バリデータオブジェクトは、Active Modelを利用するオブジェクト間で再利用できます。
class TitleValidator < ActiveModel::EachValidator Titles = ['Mr.', 'Mrs.', 'Dr.'] def validate_each(record, attribute, value) unless Titles.include?(value) record.errors[attribute] << 'must be a valid title' end end end
class Person include ActiveModel::Validations attr_accessor :title validates :title, :presence => true, :title => true end # Active Recordで用いる場合 class Person < ActiveRecord::Base validates :title, :presence => true, :title => true end
以下のようなintrospectionもサポートします。
User.validators User.validators_on(:login)
詳しくは以下を参照してください。
Rails 3.0ではActive Recordについて集中的な作業が行われました。Active Modelへの抽象化、Arelによるクエリインターフェイスの全面的な更新、バリデーションの更新を含む多くの拡張や修正が行われました。Rail 2.x APIはすべて互換性レイヤを介して利用可能になっており、この互換性レイヤは3.1までサポートされます。
Active Recordのコアメソッド群が、Arelを用いて自身のリレーションを返すようになりました。Rails 2.3.xの既存のAPIは引き続きサポートされ、Rails 3.1までは非推奨化されず、Rails 3.2までは削除されません。ただし新しいAPIでは、以下の新しいメソッド群が提供され、どのメソッドも互いにチェイン可能なリレーションを返します。
where
: 何を返すかという条件をリレーションに提供します。select
: モデルのどの属性をデータベースから返したいかを選択します。group
: 提供された属性のリレーションをグループ化します。having
: リレーションのグループ化を制約する式(GROUP BY制約)を提供します。joins
: リレーションを別のテーブルに結合(join)します。clause
: リレーションのjoinを制約する式(JOIN制約)を提供します。includes
: プリロードされた他のリレーションをインクルードします。order
: 提供された式に基づいてリレーションの並び順(order)を指定します。limit
: リレーションのレコード数を、指定の上限値に制限します(limit)。lock
: テーブルから返されたレコードをロックします。readonly
: データのコピーをリードオンリーにしたものを返します。from
: リレーションシップを複数のテーブルのどれから選択するかを指定します。scope
(旧named_scope
): リレーションを返し、他のリレーションメソッドと互いにチェインできるようにします。with_scope
とwith_exclusive_scope
もリレーションを返すようになったことでチェイン可能になりました。default_scope
もリレーションで使えるようになりました。詳しくは以下を参照してください。
:destroyed?
がActive Recordオブジェクトに追加されました。:inverse_of
Active Record関連付け(association)に追加され、読み込み済みの関連付けのインスタンスを、データベースにアクセスせずに取れるようになりました。Active Recordブランチでは他にも多数の修正が行われました。
TIME ZONE
サポートが修正され、誤った値が挿入されないようになったtable_name
がキャッシュされるようになった以下の非推奨化も行われました。
named_scope
が非推奨化され、シンプルなscope
にリネームされたscope
メソッドでは、従来の:conditions => {}
ではなく今後リレーションメソッドを使うべき(例: scope :since, lambda {|time| where("created_at > ?", time) }
)save(false)
が非推奨化され、今後はsave(:validate => false)
に:en.activerecord.errors.template
から今後:en.errors.template
に変更すべきmodel.errors.on
が非推奨化され、今後はmodel.errors[]
にvalidates_presence_of => validates
は今後:presence => true
にActiveRecord::Base.colorize_logging
とconfig.active_record.colorize_logging
が非推奨化され、今後はそれぞれRails::LogSubscriber.colorize_logging
やconfig.colorize_logging
に数か月前にActive Recordのedge版にState Machineが実装されていましたが、Rails 3.0リリースからは削除されました。
Active ResourceもActive Modelに切り出されたことで、Action PackでActive Resourceオブジェクトをシームレスに利用できるようになりました。
first
、last
、all
を追加find_every
で何も返されなかった場合にResourceNotFound
を返さないようになったsave!
を追加(オブジェクトがvalid?
でなければResourceInvalid
をraiseする)update_attribute
とupdate_attributes
をActive Resourceモデルに追加exists?
を追加SchemaDefinition
をSchema
にリネーム、define_schema
をschema
にリネームcontent-type
ではなくActive Resourcesのformat
を用いるようになったinstance_eval
を用いるようになったActiveResource::ConnectionError#to_s
を修正(@response
が#codeや#messageに応答しない場合にRuby 1.9互換になるようにする)load
が数値の配列でも使えるようになったNet::HTTP
open_timeout
にも効くようになった以下は非推奨化されました。
save(false)
が非推奨化され、今後はsave(:validate => false)
にURI.parse
と.decode
が非推奨化され、今後はライブラリで使われなくなったActive Supportの必要な機能だけを利用できるよう、多くの作業が行われました。これにより、Active Supportライブラリの一部の機能だけを使うために全体をrequire
する必要がなくなりました。これにより、Railsのさまざまなコアコンポーネントがスリム化できるようになります。
Active Supportの主な変更点は以下のとおりです。
bundle install
コマンドでインストールされます。ActiveSupport::SafeBuffer
に安全なバッファが実装されたArray.uniq_by
とArray.uniq_by!
を追加Array#rand
を削除し、Ruby 1.9からArray#sample
をバックポートしたTimeZone.seconds_to_utc_offset
が誤った値を返すバグを修正したActiveSupport::Notifications
ミドルウェアを追加ActiveSupport.use_standard_json_time_format
のデフォルトがtrueになったActiveSupport.escape_html_entities_in_json
のデフォルトがfalseになったInteger#multiple_of?
がゼロを引数として受け取れるようになり、レシーバーがゼロでない場合にfalseを返すようになったstring.chars
がstring.mb_chars
にリネームされたActiveSupport::OrderedHash
がYAMLでデシリアライズできるようになったObject#presence
を追加(#present?
の場合はオブジェクトを、それ以外の場合はnil
を返す)String#exclude?
コア拡張を追加(#include?
と逆の結果を返す)DateTime
属性を持つモデルでto_yaml
が正しく動作するために、to_i
をActiveSupport
のDateTime
に追加Enumerable#exclude?
を追加(if !x.include?
という書き方を避けるためEnumerable#include?
と逆の結果を返す)ActiveSupport::HashWithIndifferentAccess
のdeepマージをサポートEnumerable#sum
があらゆるenumerableで動作するようになった(:size
に応答しない場合でも利用可能)inspect
すると空文字列ではなく'0 seconds'が返るようになったelement
とcollection
をModelName
に追加String#to_time
やString#to_datetime
で分数形式の秒を扱うようになった:before
や:after
の両方に応答するaroundフィルタオブジェクトのコールバックを新たにサポートしたActiveSupport::OrderedHash#to_a
メソッドが返す配列セットがソート済みになった(Ruby 1.9のHash#to_a
と一致)MissingSourceFile
は定数として存在するがLoadError
と等価になったClass#class_attribute
を追加(値を継承可能でサブクラスから上書きできるクラスレベルの属性を宣言できる)ActiveRecord::Associations
のDeprecatedCallbacks
がついに削除されたObject#metaclass
がKernel#singleton_class
になりRubyと一致するようになった以下のメソッドはRuby 1.8.7と1.9で利用できるようになったため削除されました。
Integer#even?
とInteger#odd?
String#each_char
String#start_with?
とString#end_with?
(三人称のエイリアスは保持)String#bytesize
Object#tap
Symbol#to_proc
Object#instance_variable_defined?
Enumerable#none?
REXMLのセキュリティパッチは、初期パッチレベルのRuby 1.8.7で必要なため引き続きActive Supportに置かれています。適用が必要かどうかはActive Supportで認識されます。
以下のメソッドはフレームワークで今後使われないため削除されました。
Kernel#daemonize
Object#remove_subclasses_of
、Object#extend_with_included_modules_from
、Object#extended_by
Class#remove_class
Regexp#number_of_captures
、Regexp.unoptionalize
、Regexp.optionalize
、Regexp#number_of_captures
Action Mailerで、メールライブラリとしてTMailに代えて新たにMailに置き換えられた新しいAPIが提供されました。Action Mailer自身はほぼ完全に書き換えられ、多くのコードに手が入れられました。その結果Action MailerはAbstract Controllerをシンプルに継承するようになり、Rails DSLでMail gemをラップするようになりました。これにより、Action Mailer内の他のライブラリとのコード量や重複が著しく削減されました。
app/mailers
に置かれるようになったattachments
、headers
、mail
)でメールを送信できるようになったattachments.inline
メソッドを用いてインライン添付ファイルをネイティブでサポートするようになったMail::Message
オブジェクトを返すようになり、deliver
メッセージを送信することで自分自身を送信できるようになったmail
配信メソッドが、有効なメールヘッダーのハッシュ(それらの値ペアを含む)を受け取れるようになったmail
配信メソッドがAction Controllerのrespond_to
と似た振る舞いになり、テンプレートを明示的または暗黙的にレンダリングできるようになった(Action Mailerはメールを必要に応じてマルチパートメールにする)mail
のブロック内でformat.mime_type
呼び出しにprocを1つ渡すことで、特定の種類のテキストを明示的にレンダリングしたり、レイアウトや別のテンプレートを追加したりできるようになった。そのproc内のrender
呼び出しはAbstract Controllerのもので、同じオプションをサポートする。以下は非推奨化されました。
:charset
、:content_type
、:mime_version
、:implicit_parts_order
はすべて非推奨化され、今後はActionMailer.default :key => value
方式の宣言になったcreate_method_name
やdeliver_method_name
が非推奨化された: 今後は単にmethod_name
を呼ぶこと(Mail::Message
オブジェクトが1つ返る)ActionMailer.deliver(message)
が非推奨化された: 今後は単にmessage.deliver
を呼ぶことtemplate_root
が非推奨化された: 今後はmail
生成ブロック内のformat.mime_type
メソッドからのproc内でrender呼び出しにオプションを渡すことbody
メソッド(body {:ivar => value}
)が非推奨化された: 今後はインスタンス変数をメソッド内で直接宣言するだけでビューで利用できるようになるapp/models
に配置することが非推奨化された: 今後はapp/mailers
を使うこと詳しくは以下を参照してください。
Rails3を頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に敬意を表明いたします。
Rails 3.0リリースノート編集担当: Mikel Lindsaar
Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。
原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨
本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。
Railsガイド運営チーム (@RailsGuidesJP)
Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。