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

Ruby on Rails 3.0 リリースノート

Rails 3.0 はポニーと虹です!あなたの夕食を作って、洗濯物をたたんでくれます。それが到着する前の人生がどのように可能だったのか不思議に思うでしょう。これは私たちが今までに行った中で最高のバージョンです!

しかし、真剣に話すと、本当に素晴らしいものです。Merbチームが参加し、フレームワークの不可知論、スリムで高速な内部、およびいくつかの便利なAPIをもたらした良いアイデアがすべて取り入れられています。Merb 1.x から Rails 3.0 に移行する場合、多くのものが認識できるはずです。Rails 2.x から来る場合も、それを愛するでしょう。

私たちの内部のクリーンアップに興味がなくても、Rails 3.0 は喜ばれるでしょう。新しい機能と改善されたAPIがたくさんあります。Rails開発者になるのにこれほど良い時期はありませんでした。ハイライトのいくつかは次のとおりです。

それだけでなく、古いAPIを警告とともに非推奨にしました。これは、既存のアプリケーションをRails 3に移行する際に、すぐにすべての古いコードを最新のベストプラクティスに書き直す必要がないことを意味します。

これらのリリースノートは主要なアップグレードをカバーしていますが、すべての細かいバグ修正や変更は含まれていません。Rails 3.0 は、250人以上の著者によるほぼ4,000のコミットで構成されています!すべてを見たい場合は、GitHubのメインRailsリポジトリのコミットのリストをチェックしてください。

Rails 3をインストールするには:

# セットアップにsudoが必要な場合はsudoを使用してください
$ gem install rails

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

既存のアプリケーションをアップグレードする場合、入念なテストカバレッジを持っていることが重要です。また、Rails 3に更新する前に、まずRails 2.3.5にアップグレードし、アプリケーションが正常に動作することを確認してください。その後、以下の変更に注意してください:

1.1 Rails 3は少なくともRuby 1.8.7を必要とします

Rails 3.0 はRuby 1.8.7以上が必要です。以前のRubyバージョンのサポートは公式に終了し、できるだけ早くアップグレードする必要があります。Rails 3.0 はRuby 1.9.2とも互換性があります。

Ruby 1.8.7 p248とp249には、Rails 3.0をクラッシュさせるマーシャリングのバグがあります。ただし、Ruby Enterprise Editionはリリース1.8.7-2010.02以降、これらのバグを修正しています。1.9系では、Rails 3.0で完全にセグフォルトが発生するため、スムーズに動作するためには1.9.2にジャンプする必要があります。

1.2 Rails Applicationオブジェクト

同じプロセス内で複数のRailsアプリケーションを実行するための基盤をサポートするために、Rails 3ではApplicationオブジェクトの概念が導入されました。アプリケーションオブジェクトは、すべてのアプリケーション固有の設定を保持し、以前のバージョンのRailsのconfig/environment.rbと非常に似ています。

各Railsアプリケーションには、対応するアプリケーションオブジェクトが必要です。アプリケーションオブジェクトはconfig/application.rbで定義されます。既存のアプリケーションをRails 3にアップグレードする場合、このファイルを追加し、適切な設定をconfig/environment.rbからconfig/application.rbに移動する必要があります。

1.3 script/* は script/rails に置き換えられました

新しいscript/railsは、以前はscriptディレクトリにあったすべてのスクリプトを置き換えます。ただし、直接script/railsを実行するわけではありません。railsコマンドは、Railsアプリケーションのルートで呼び出されていることを検出し、スクリプトを実行します。使用方法は次のとおりです:

$ rails console                      # script/consoleの代わりに
$ rails g scaffold post title:string # script/generate scaffold post title:stringの代わりに

すべてのオプションのリストについては、rails --helpを実行してください。

1.4 依存関係とconfig.gem

config.gemメソッドはなくなり、bundlerGemfileを使用するように置き換えられました。詳細は以下の「Gemsのベンダリング」を参照してください。

1.5 アップグレードプロセス

アップグレードプロセスを支援するために、Rails Upgradeというプラグインが作成されました。

プラグインをインストールした後、rake rails:upgrade:checkを実行して、更新が必要な部分をアプリケーションでチェックします(更新方法に関する情報へのリンクが表示されます)。また、現在のconfig.gem呼び出しに基づいてGemfileを生成するタスクや、現在のルートファイルから新しいルートファイルを生成するタスクも提供します。プラグインを取得するには、次のコマンドを実行してください: bash $ ruby script/plugin install git://github.com/rails/rails_upgrade.git

それがどのように機能するかの例はRails Upgrade is now an Official Pluginで見ることができます。

Rails Upgradeツール以外にも、同じことをしており、同じ問題に直面している可能性のあるIRCやrubyonrails-talkの人々がいます。アップグレードの際に自分自身の経験をブログに投稿して、他の人があなたの知識を活用できるようにしてください!

2 Rails 3.0アプリケーションの作成

# 'rails' RubyGemがインストールされている必要があります
$ rails new myapp
$ cd myapp

2.1 ジェムのベンダリング

Railsは、アプリケーションの開始に必要なジェムを決定するために、アプリケーションのルートにGemfileを使用します。このGemfileBundlerによって処理され、すべての依存関係がインストールされます。それはアプリケーションにローカルに依存しないようにするために、すべての依存関係をインストールすることさえできます。

詳細はこちら:- bundler homepage

2.2 最新版の利用

BundlerGemfileにより、新しい専用のbundleコマンドを使用してRailsアプリケーションを簡単にフリーズすることができます。そのため、rake freezeはもはや関係ありません。

Gitリポジトリから直接バンドルする場合は、--edgeフラグを渡すことができます。

$ rails new myapp --edge

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

$ ruby /path/to/rails/bin/rails new myapp --dev

3 Railsのアーキテクチャの変更

Railsのアーキテクチャには6つの主な変更があります。

3.1 Railtiesの再構築

Railtiesは、Railsフレームワーク全体の一貫したプラグインAPIを提供するように更新され、ジェネレータとRailsバインディングの完全な書き直しも行われました。その結果、開発者はジェネレータとアプリケーションフレームワークの任意の重要な段階に一貫した定義済みの方法でフックすることができるようになりました。

3.2 すべてのRailsコアコンポーネントが切り離されました

MerbとRailsのマージに伴い、Railsコアコンポーネント間の緊密な結合を解消する作業が行われました。これは現在達成されており、すべてのRailsコアコンポーネントがプラグインの開発に使用できる同じAPIを使用しています。これは、作成するプラグインやDataMapperやSequelのようなコアコンポーネントの置き換えなど、Railsコアコンポーネントがアクセスできるすべての機能にアクセスし、拡張および強化することができることを意味します。

3.3 Active Modelの抽象化

コアコンポーネントの切り離しの一環として、Active Recordへのすべての依存関係をAction Packから抽出しました。これは現在完了しています。新しいORMプラグインは、Action Packとシームレスに連携するためにActive Modelインターフェースを実装するだけで済みます。

3.4 コントローラの抽象化

コアコンポーネントの切り離しのもう一つの大きな部分は、HTTPの概念から分離されたベースのスーパークラスを作成し、ビューのレンダリングなどを処理するためです。AbstractControllerの作成により、ActionControllerActionMailerは大幅に簡素化され、これらのライブラリから共通のコードが削除され、Abstract Controllerに配置されました。

3.5 Arelの統合

Arel(またはActive Relation)は、Active Recordの基盤として採用され、Railsで必要とされるようになりました。Arelは、Active RecordのSQL抽象化を提供し、Active Recordの関係機能の基盤を提供します。

3.6 メールの抽出

Action Mailerは、その始まり以来、モンキーパッチ、プリパーサー、配信および受信エージェントを持っていました。さらに、TMailがソースツリーにベンダリングされていました。バージョン3では、すべてのメールメッセージ関連の機能がMailジェムに抽象化されました。これにより、コードの重複が減少し、Action Mailerとメールパーサーの間に定義可能な境界が作成されます。

4 ドキュメント

Railsツリーのドキュメントは、すべてのAPIの変更が反映されるように更新されています。さらに、Rails Edge GuidesもRails 3.0の変更を反映するために1つずつ更新されています。ただし、guides.rubyonrails.orgのガイドは引き続き安定版のRailsのみを含んでいます(現時点ではバージョン2.3.5、3.0がリリースされるまで)。

5 国際化

Rails 3では、I18nサポートに関して多くの作業が行われており、最新のI18n gemには多くの高速化が提供されています。

  • 任意のオブジェクトにI18nの振る舞いを追加することができます。これは、ActiveModel::TranslationActiveModel::Validationsを含めることで実現できます。また、翻訳のためのerrors.messagesのフォールバックもあります。
  • 属性にはデフォルトの翻訳を設定することができます。
  • フォームの送信タグは、オブジェクトの状態に応じて正しいステータス(作成または更新)を自動的に取得し、正しい翻訳を表示します。
  • I18nを使用したラベルは、属性名を渡すだけで動作します。

詳細はこちらを参照してください:- Rails 3 I18nの変更

6 Railties

主要なRailsフレームワークの切り離しに伴い、Railtiesは大幅に改良され、フレームワーク、エンジン、またはプラグインのリンクアップをできるだけ簡単かつ拡張可能にするようになりました。

  • 各アプリケーションには独自の名前空間があり、例えばYourAppName.bootでアプリケーションを起動することで、他のアプリケーションとのやり取りが容易になります。
  • Rails.root/app以下のすべてのものがロードパスに追加されるため、app/observers/user_observer.rbを作成するだけでRailsがそれを修正せずにロードします。
  • Rails 3.0では、さまざまなRails全体の設定オプションを一元的に提供するRails.configオブジェクトが提供されます。

アプリケーションの生成には、test-unit、Active Record、Prototype、Gitのインストールをスキップするための追加のフラグが追加されました。また、新しい--devフラグが追加され、アプリケーションがRailsのチェックアウトを指すGemfileで設定されます(これはrailsバイナリのパスによって決定されます)。詳細については、rails --helpを参照してください。

Railtiesのジェネレータは、Rails 3.0で大幅に改良されました。

  • ジェネレータは完全に書き直され、後方互換性がありません。
  • RailsテンプレートAPIとジェネレータAPIが統合されました(以前と同じです)。
  • ジェネレータはもはや特別なパスからロードされません。代わりに、Rubyのロードパスで見つかるようになりました。したがって、rails generate fooと呼び出すと、generators/foo_generatorを探します。
  • 新しいジェネレータはフックを提供し、テンプレートエンジン、ORM、テストフレームワークなどが簡単にフックできます。
  • 新しいジェネレータでは、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_ROOTRails.rootに置き換えられました。
  • RAILS_ENVRails.envに置き換えられました。
  • RAILS_DEFAULT_LOGGERRails.loggerに置き換えられました。

PLUGIN/rails/tasksPLUGIN/tasksはもはやロードされず、すべてのタスクはPLUGIN/lib/tasksに配置する必要があります。

詳細はこちらを参照してください:

7 Action Pack

Action Packでは、内部および外部の変更が大幅に行われました。

7.1 Abstract Controller

Abstract Controllerは、Action Controllerの汎用部分を再利用可能なモジュールに分離しました。これにより、任意のライブラリがテンプレートのレンダリング、パーシャルのレンダリング、ヘルパー、翻訳、ログなど、リクエストレスポンスサイクルの任意の部分を使用できるようになりました。この抽象化により、ActionMailer::Baseは今では単にAbstractControllerを継承し、Rails DSLをMail gemにラップするだけです。

また、Action Controllerを整理する機会も提供され、コードを簡素化するためにできるだけ抽象化しました。

ただし、Abstract Controllerはユーザー向けのAPIではなく、Railsの日常的な使用では遭遇することはありません。

詳細はこちらを参照してください:- Rails Edge Architecture

7.2 Action Controller

  • application_controller.rbでは、デフォルトでprotect_from_forgeryが有効になっています。
  • cookie_verifier_secretは非推奨となり、代わりにRails.application.config.cookie_secretを使用して割り当てられ、独自のファイルconfig/initializers/cookie_verification_secret.rbに移動しました。
  • session_storeActionController::Base.sessionで設定されていましたが、これはRails.application.config.session_storeに移動しました。デフォルトはconfig/initializers/session_store.rbで設定されます。
  • cookies.secureを使用して、暗号化された値をクッキーに設定することができます。例:cookie.secure[:key] => value
  • cookies.permanentを使用して、クッキーハッシュに永続的な値を設定できます。例:cookie.permanent[:key] => value。署名された値の場合、検証エラーが発生した場合に例外が発生します。
  • :notice => 'This is a flash message'または:alert => 'Something went wrong'respond_toブロック内のformat呼び出しに渡すことができます。flash[]ハッシュは以前と同じように機能します。
  • コントローラでrespond_withメソッドが追加され、古くからあるformatブロックを簡素化します。
  • ActionController::Responderが追加され、レスポンスの生成方法を柔軟に設定できるようになりました。 非推奨:

  • filter_parameter_loggingは、config.filter_parameters << :passwordを使用するように非推奨となりました。

詳細情報:

7.3 Action Dispatch

Action DispatchはRails 3.0で新しく導入され、ルーティングのための新しい、よりクリーンな実装を提供します。

  • ルーターの大規模なクリーンアップと書き直しを行い、Railsルーターはrack_mountという独立したソフトウェアの上にRails DSLを持つようになりました。
  • 各アプリケーションで定義されるルートは、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リリースで削除されます。

非推奨:

  • REST以外のアプリケーションのためのキャッチオールルート(/:controller/:action/:id)はコメントアウトされています。
  • :path_prefixルートはもはや存在せず、:name_prefixは与えられた値の末尾に自動的に"_"が追加されるようになりました。

詳細情報: * Rails 3ルーター: Rack it Up * Rails 3でのルートの刷新 * Rails 3での汎用アクション

7.4 Action View

7.4.1 Unobtrusive JavaScript

Action Viewヘルパーには大規模な書き直しが行われ、Unobtrusive JavaScript(UJS)フックが実装され、古いインラインAJAXコマンドが削除されました。これにより、Railsは準拠したUJSドライバを使用してヘルパーのUJSフックを実装することができます。

これは、以前のremote_<method>ヘルパーがRailsコアから削除され、Prototype Legacy Helperに移動されたことを意味します。HTMLにUJSフックを取得するためには、remote => trueを渡すようになりました。例えば:

form_for @post, :remote => true

次のようなHTMLを生成します:

<form action="http://host.com" id="create-post" method="post" data-remote="true">

7.4.2 ブロックを使ったヘルパー

form_fordiv_forなど、ブロックからコンテンツを挿入するヘルパーは、今では<%=を使用します:

<%= form_for @post do |f| %>
  ...
<% end %>

同様のヘルパーは、手動で出力バッファに追加するのではなく、文字列を返すことが期待されています。

cachecontent_forなど、他の何かを行うヘルパーは、この変更の影響を受けません。引き続き&lt;%を使用する必要があります。

7.4.3 その他の変更

  • HTML出力をエスケープするためにh(string)を呼び出す必要はもはやありません。すべてのビューテンプレートでデフォルトで有効になっています。エスケープされていない文字列が必要な場合は、raw(string)を呼び出してください。
  • ヘルパーはデフォルトでHTML5を出力するようになりました。
  • フォームのラベルヘルパーは、シングルバリューでI18nから値を取得するようになりました。つまり、f.label :name:nameの翻訳を取得します。
  • I18nのセレクトラベルは、:en.helpers.selectではなく、:en.support.selectになるようになりました。
  • ERBテンプレート内のRuby補間の末尾の改行をHTML出力から削除するために、末尾にマイナス記号を置く必要はもはやありません。
  • Action Viewにgrouped_collection_selectヘルパーが追加されました。
  • content_for?が追加され、ビュー内でコンテンツの存在をチェックしてからレンダリングすることができます。
  • フォームヘルパーにvalue => nilを渡すと、フィールドのvalue属性がデフォルト値ではなくnilに設定されます。
  • フォームヘルパーにid => nilを渡すと、それらのフィールドはid属性を持たない状態でレンダリングされます。
  • image_tagalt => nilを渡すと、imgタグはalt属性を持たない状態でレンダリングされます。

8 Active Model

Active ModelはRails 3.0で新しく導入されました。これは、任意のORMライブラリがRailsと対話するために使用するためのActive Modelインターフェースを実装することにより、抽象化レイヤーを提供します。

8.1 ORMの抽象化とAction Packインターフェース

コアコンポーネントのカップリングを解除するために、Active RecordからAction Packへのすべての関連を抽出する作業が行われました。これは現在完了しています。新しいORMプラグインは、Action Packとシームレスに連携するためにActive Modelのインターフェースを実装するだけで動作します。

詳細はこちら:- Make Any Ruby Object Feel Like ActiveRecord

8.2 バリデーション

バリデーションはActive RecordからActive Modelに移動され、Rails 3でORMライブラリ全体で動作するバリデーションのインターフェースが提供されました。

  • validates :attribute, options_hashというショートカットメソッドが追加され、すべてのバリデーションクラスメソッドにオプションを渡すことができます。バリデーションメソッドには複数のオプションを渡すことができます。
  • 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でもサポートされており、新しいvalidatesメソッドは既存のAPIの代替ではなく、モデルのバリデーションを補完するために設計されています。

また、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

また、内省のサポートもあります:

User.validators
User.validators_on(:login)

詳細は以下を参照してください:

9 Active Record

Active RecordはRails 3.0で多くの注目を浴び、Active Modelへの抽象化、Arelを使用したクエリインターフェースの完全な更新、バリデーションの更新、および多くの改善と修正が行われました。Rails 2.xのすべてのAPIは、3.1バージョンまでサポートされる互換性レイヤーを介して使用できます。

9.1 クエリインターフェース

Active RecordはArelを使用することで、コアメソッドでリレーションを返すようになりました。Rails 2.3.xの既存のAPIは引き続きサポートされ、Rails 3.1まで非推奨にならず、Rails 3.2まで削除されませんが、新しいAPIでは以下の新しいメソッドが提供され、すべてリレーションを返すため、チェーンすることができます:

  • where - リレーションに条件を提供し、返される内容を指定します。
  • select - データベースから返されるモデルの属性を選択します。
  • group - 指定された属性でリレーションをグループ化します。
  • having - グループリレーションを制限する式を提供します(GROUP BY制約)。
  • joins - リレーションを別のテーブルに結合します。
  • clause - 結合リレーションを制限する式を提供します(JOIN制約)。
  • includes - 他のリレーションを事前にロードします。
  • order - 指定された式に基づいてリレーションを並べ替えます。
  • limit - 指定されたレコード数にリレーションを制限します。
  • lock - テーブルから返されるレコードをロックします。
  • readonly - データの読み取り専用コピーを返します。
  • from - 複数のテーブルから関係を選択する方法を提供します。
  • scope - (以前のnamed_scope)リレーションを返し、他のリレーションメソッドとチェーンすることができます。
  • with_scope - およびwith_exclusive_scopeもリレーションを返すようになり、チェーンすることができます。
  • default_scope - リレーションでも機能します。

詳細は以下を参照してください:

9.2 改善点

  • Active Recordオブジェクトに:destroyed?が追加されました。
  • Active Recordの関連に:inverse_ofが追加され、データベースにアクセスせずにすでにロードされた関連のインスタンスを取得できるようになりました。

9.3 パッチと非推奨

さらに、Active Recordブランチで多くの修正が行われました:

  • SQLite 2のサポートはSQLite 3に置き換えられました。
  • カラムの順序に対するMySQLのサポート。
  • PostgreSQLアダプタのTIME ZONEサポートが修正され、不正な値が挿入されなくなりました。
  • PostgreSQLのテーブル名に複数のスキーマをサポート。
  • PostgreSQLのXMLデータ型カラムのサポート。
  • table_nameはキャッシュされるようになりました。
  • Oracleアダプタにも多くのバグ修正が行われました。 以下の非推奨事項もあります:

  • Active Recordクラス内のnamed_scopeは非推奨となり、scopeに名前が変更されました。

  • scopeメソッドでは、:conditions => {}の代わりに関連メソッドを使用するように移行する必要があります。例えば、scope :since, lambda {|time| where("created_at > ?", time) }

  • save(false)は非推奨であり、save(:validate => false)を使用するようになりました。

  • Active RecordのI18nエラーメッセージは、:en.activerecord.errors.templateから:en.errors.templateに変更する必要があります。

  • model.errors.onは非推奨であり、model.errors[]を使用するようになりました。

  • validates_presence_of => validates... :presence => true

  • ActiveRecord::Base.colorize_loggingconfig.active_record.colorize_loggingは非推奨であり、Rails::LogSubscriber.colorize_loggingまたはconfig.colorize_loggingを使用するようになりました。

注意:State Machineの実装はActive Recordのエッジに数ヶ月間存在していましたが、Rails 3.0リリースから削除されました。

10 Active Resource

Active ResourceもActive Modelに抽出され、Active ResourceオブジェクトをAction Packとシームレスに使用できるようになりました。

  • Active Modelを介したバリデーションの追加。
  • オブザーバーフックの追加。
  • HTTPプロキシのサポート。
  • ダイジェスト認証のサポートの追加。
  • モデルの命名をActive Modelに移動。
  • Active Resource属性をインデックスアクセス可能なハッシュに変更。
  • 同等の検索スコープのためのfirstlastallのエイリアスを追加。
  • find_everyは、何も返さない場合にResourceNotFoundエラーを返さないように変更されました。
  • オブジェクトがvalid?でない場合にResourceInvalidを発生させるsave!を追加。
  • Active Resourceモデルにupdate_attributeupdate_attributesを追加。
  • exists?を追加。
  • SchemaDefinitionSchemaに、define_schemaschemaに名前変更。
  • エラーをロードするために、リモートエラーのcontent-typeではなくActive Resourcesのformatを使用するように変更。
  • スキーマブロックにはinstance_evalを使用。
  • ActiveResource::ConnectionError#to_sを修正し、@response#codeまたは#messageに応答しない場合にRuby 1.9の互換性を処理するように変更。
  • JSON形式のエラーのサポートを追加。
  • 数値配列でloadが動作するように修正。
  • リモートリソースからの410レスポンスをリソースが削除されたと認識するように変更。
  • Active Resource接続にSSLオプションを設定する機能を追加。
  • 接続タイムアウトの設定はNet::HTTPopen_timeoutにも影響を与えます。

非推奨事項:

  • save(false)は非推奨であり、save(:validate => false)を使用するようになりました。
  • Ruby 1.9.2:URI.parse.decodeは非推奨となり、ライブラリでは使用されなくなりました。

11 Active Support

Active Supportでは、Active Supportライブラリ全体を要求する必要がなくなるように、チェリーピック可能にするための大きな努力が行われました。これにより、Railsのさまざまなコアコンポーネントをよりスリムに実行することができます。

Active Supportの主な変更点は以下です:

  • ライブラリ内の未使用のメソッドを大幅に削除しました。
  • Active SupportはもはやTZInfo、Memcache Client、Builderのバージョンを提供しません。これらはすべて依存関係として含まれ、bundle installコマンドでインストールされます。
  • ActiveSupport::SafeBufferでセーフバッファが実装されました。
  • Array.uniq_byArray.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.charsstring.mb_charsに名前が変更されました。
  • ActiveSupport::OrderedHashはYAMLを介して逆シリアル化できるようになりました。
  • LibXMLとNokogiriを使用したXmlMiniのSAXベースのパーサーを追加しました。
  • Object#presenceを追加し、#present?であればオブジェクトを返し、そうでなければnilを返します。
  • String#exclude?コア拡張を追加し、#include?の逆を返します。
  • ActiveSupportDateTimeto_iを追加し、DateTime属性を持つモデルでto_yamlが正しく動作するようにしました。
  • Enumerable#include?と同等のEnumerable#exclude?を追加し、!x.include?を避けます。
  • RailsのためにデフォルトでXSSエスケープをオンに切り替えます。
  • ActiveSupport::HashWithIndifferentAccessでのディープマージのサポートを追加します。
  • Enumerable#sumは、:sizeに応答しない場合でもすべての列挙可能なオブジェクトで動作するようになりました。
  • 長さがゼロの期間のinspectは、空の文字列ではなく'0 seconds'を返します。
  • ModelNameelementcollectionを追加します。
  • String#to_timeString#to_datetimeは小数秒を処理できるようになりました。
  • 新しいコールバックに対応するために、:before:afterに応答するaroundフィルターオブジェクトのサポートを追加しました。
  • ActiveSupport::OrderedHash#to_aメソッドは、配列の順序付けられたセットを返します。Ruby 1.9のHash#to_aに一致します。
  • MissingSourceFileは定数として存在しますが、現在は単にLoadErrorと等しいです。
  • クラスレベルの属性を宣言できるようにするために、Class#class_attributeを追加しました。この属性の値は継承可能で、サブクラスで上書きできます。
  • ActiveRecord::AssociationsDeprecatedCallbacksを最終的に削除しました。
  • Object#metaclassは、Rubyに合わせるためにKernel#singleton_classに変更されました。 以下のメソッドは、Ruby 1.8.7および1.9で利用可能になったため、削除されました。

  • Integer#even?およびInteger#odd?

  • String#each_char

  • String#start_with?およびString#end_with?(3人称のエイリアスは保持されます)

  • 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_fromObject#extended_by
  • Class#remove_class
  • Regexp#number_of_capturesRegexp.unoptionalizeRegexp.optionalizeRegexp#number_of_captures

12 Action Mailer

Action Mailerは、TMailが新しいメールライブラリであるMailに置き換えられることで、新しいAPIが与えられました。Action Mailer自体もほぼ完全に書き直され、ほぼすべてのコードが触れられました。その結果、Action Mailerは単純にAbstract Controllerを継承し、Mail gemをRails DSLでラップするようになりました。これにより、Action Mailerのコード量と他のライブラリの重複がかなり減少しました。

  • すべてのメーラーは、デフォルトでapp/mailersに配置されます。
  • 新しいAPIを使用してメールを送信するための3つのメソッドattachmentsheadersmailが利用可能になりました。
  • Action Mailerは、attachments.inlineメソッドを使用してインラインの添付ファイルをネイティブにサポートします。
  • Action Mailerのメール送信メソッドは、Mail::Messageオブジェクトを返すようになりました。これにより、deliverメッセージを送信して自分自身を送信することができます。
  • すべての配信メソッドは、Mail gemに抽象化されました。
  • メール配信メソッドは、有効なメールヘッダーフィールドとその値のペアのハッシュを受け入れることができます。
  • mail配信メソッドは、Action Controllerのrespond_toと同様の方法で動作し、テンプレートを明示的または暗黙的にレンダリングすることができます。Action Mailerは、必要に応じてメールをマルチパートメールに変換します。
  • メールブロック内のformat.mime_type呼び出しには、procを渡すことができ、特定のタイプのテキストを明示的にレンダリングしたり、レイアウトや異なるテンプレートを追加したりすることができます。proc内のrender呼び出しは、Abstract Controllerからのもので、同じオプションをサポートしています。
  • メーラーユニットテストは、機能テストに移動されました。
  • Action Mailerは、すべてのヘッダーフィールドと本文の自動エンコードをMail Gemに委任します。
  • Action Mailerは、メールの本文とヘッダーを自動的にエンコードします。

非推奨:

  • :charset:content_type:mime_version:implicit_parts_orderは、ActionMailer.default :key => valueスタイルの宣言に置き換えるため、非推奨です。
  • メーラーの動的なcreate_method_namedeliver_method_nameは非推奨です。単にmethod_nameを呼び出し、Mail::Messageオブジェクトが返されるようになりました。
  • ActionMailer.deliver(message)は非推奨です。単にmessage.deliverを呼び出してください。
  • template_rootは非推奨です。mail生成ブロック内のformat.mime_typeメソッド内のレンダーコールにオプションを渡してください。
  • インスタンス変数を定義するためのbodyメソッドは非推奨です(body {:ivar => value})。直接メソッド内でインスタンス変数を宣言し、ビューで使用できるようにします。
  • app/modelsにメーラーがあることは非推奨です。代わりにapp/mailersを使用してください。

詳細は以下を参照してください。

13 クレジット

Rails 3.0リリースノートは、Mikel Lindsaarによって編集されました。Railsに多くの時間を費やした多くの人々に感謝します。Railsの全貢献者のリストをご覧ください。

フィードバック

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

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

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

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

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