Rails 3.1の注目ポイント
本リリースノートでは、主要な変更についてのみ説明します。多数のバグ修正および変更点については、GitHubのRailsリポジトリにあるコミットリストのchangelogを参照してください。
既存のアプリケーションをアップグレードするのであれば、その前に質のよいテストカバレッジを用意するのはよい考えです。アプリケーションがRails 3までアップグレードされていない場合は先にそれを完了し、アプリケーションが正常に動作することを十分確認してからRails 3.1にアップデートしてください。以下の注意点を参照してからアップデートしてください。
Rails 3.1ではRuby 1.8.7以上が必須です。これより前のバージョンのRubyのサポートは公式に廃止されたため、速やかにRubyをアップグレードすべきです。Rails 3.1は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をお使いください。
以下の変更点は、アプリケーションをRail 3.1.x系の中で最新のRails 3.1.3にアップグレードする場合を想定しています。
Gemfile
を以下のように変更します。
gem "rails", "= 3.1.3" gem "mysql2" # 新しいアセットパイプラインで必要 group :assets do gem "sass-rails", "~> 3.1.5" gem "coffee-rails", "~> 3.1.1" gem "uglifier", ">= 1.0.3" end # Rails 3.1ではjQueryがデフォルトのJavaScriptライブラリとなる gem "jquery-rails"
アセットパイプラインのために以下の追加が必要です。
config.assets.enabled = true config.assets.version = '1.0'
アプリケーションで、リソースへのルーティングに"/assets"を使っている場合、必要に応じてプレフィックスを変更してアセットのコンフリクトを避けてください。
# デフォルトは'/assets' config.assets.prefix = '/asset-files'
RJSの設定config.action_view.debug_rjs = true
を削除します。
アセットパイプラインを有効にする場合は以下を追加します。
# アセットを圧縮しない config.assets.compress = false # アセットを読み込む行を拡大する config.assets.debug = true
以下の変更のほとんどもアセットパイプライン用です。詳しくはアセットパイプラインガイドを参照してください。
# JavaScriptsとCSSの圧縮 config.assets.compress = true # プリコンパイル済みアセットがない場合はアセットパイプラインにフォールバックしない config.assets.compile = false # アセットURL用のダイジェストを生成する config.assets.digest = true # デフォルトはRails.root.join("public/assets") # config.assets.manifest = YOUR_PATH # 追加のアセットをプリコンパイルする(application.js、application.css、およびすべてのnon-JS/CSSは既に追加済み) # config.assets.precompile `= %w( search.js ) # アプリへの全アクセスのSSL、Strict-Transport-Security、secure cookieを強制する # config.force_ssl = true
# テストの静的アセットサーバーをCache-Controlで構成(パフォーマンス向上用) config.serve_static_assets = true config.static_cache_control = "public, max-age=3600"
パラメータをラップしてネスト済みハッシュにしたい場合は、以下の内容のファイルを追加します。新規アプリケーションでは今後これがデフォルトになります。
# このファイルを変更したら必ずサーバーをリスタートすること # このファイルに含まれるActionController::ParamsWrapperの設定は # デフォルトで有効になる # JSONパラメーターのラップを有効にする # 空配列に:formatを設定すると無効にできる ActiveSupport.on_load(:action_controller) do wrap_parameters :format => [:json] end # JSONのroot要素を無効にする(デフォルト) ActiveSupport.on_load(:active_record) do self.include_root_in_json = false end
:cache
と:concat
オプションを削除する:cache
と:concat
オプションは今後使われないので、このオプションをビューから削除します。# 以下を実行する前に'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/railties/bin/rails new myapp --dev
アセットパイプライン(Assets Pipeline)はRails 3.1の大きな変更点です。アセットパイプラインは、CSSやJavaScriptのコードを第一級市民として扱い、プラグインやエンジンの利用を含めて正式に編成できるようにします。
アセットパイプラインはSprocketsによって強化されています。また、アセットパイプラインガイドに解説があります。
HTTPストリーミングもRails 3.1の変更点の1つです。これにより、サーバーがレスポンス生成の途中でもスタイルシートやJavaScriptファイルをブラウザからダウンロードできるようになります。利用にはRuby 1.9.2の他に、Webサーバーでのサポートも必要ですが、よく使われているNginxとUnicornの組み合わせで利用可能です。
Rails 3.1で同梱されるデフォルトのJavaScriptがjQueryになりました。Prototype.jsを使いたい場合は以下のように簡単に切り替えられます。
$ rails new myapp -j prototype
Rails 3.1のActive RecordにIdentity Mapが搭載されました。Identity Mapは直前にインスタンス化された複数のレコードを保持し、次のアクセス時にそのレコードに関連付けられたオブジェクトを返します。Identity Mapはリクエストごとに作成され、リクエストの完了時に破棄されます。
Rails 3.1のIdentity Mapはデフォルトでオフになっています(訳注: Identity Mapはその後Rails 4.0で削除されました)。
jQueryが新たにデフォルトのJavaScriptライブラリになりました。
jQueryやPrototype.jsは今後ベンダリングされません。代わりにjquery-rails gemやprototype-rails gemで提供されます。
アプリケーションジェネレータで、任意の文字列を取れる-j
オプションを使えるようになりました。"foo"を渡すとGemfile
に"foo-rails" gemが追加され、アプリケーションのJavaScriptマニフェストで"foo"と"foo_ujs"がrequireされます。現時点では"prototype-rails"と"jquery-rails"のみが存在し、それらのファイルはアセットパイプライン経由で提供されます。
アプリやプラグインの生成時に--skip-gemfile
や--skip-bundle
を指定しない場合、bundle install
を実行します。
コントローラやリソースをジェネレータで生成すると、アセットのスタブが自動で作成されるようになりました(--skip-assets
でオフにできます)。CoffeeScriptやSassのライブラリが利用可能な場合、生成されたスタブでCoffeeScriptやSassが使われます。
scaffoldやアプリをRuby 1.9で生成すると、ハッシュのスタイルがRuby 1.9のスタイルになります。--old-style-hash
を渡すと従来のハッシュスタイルで生成できます。
scaffoldのコントローラジェネレータが、XMLフォーマットブロックに代えてJSONフォーマットブロックを生成するようになりました。
コンソールでActive RecordログがSTDOUTにインライン出力されるようになりました。
設定にconfig.force_ssl
が追加されました。これはRack::SSL
ミドルウェアを読み込んであらゆるリクエストを強制的にHTTPSプロトコルにします。
Railsプラグインを生成するrails plugin new
コマンドが追加されました。生成されるプラグインにはgemspec、テスト、テスト用ダミーアプリケーションが含まれます。
Rack::Etag
とRack::ConditionalGet
がデフォルトのミドルウェアスタックに追加されました。
Rack::Cache
がデフォルトのミドルウェアスタックに追加されます。
エンジンでメジャーアップデートが行われました。任意のパスをマウントする、アセットの有効化、ジェネレータの実行などを含みます。
CSRFトークンの認証を照合できない場合にwarningが出力されるようになりました。
特定のコントローラでforce_ssl
を指定すると、そのコントローラからブラウザにHTTPSプロトコルによるデータ通信を強制できるようになりました。HTTPSを特定のアクションに限定する:only
や:except
も利用できます。
(個人情報などの)重要な情報を含むクエリ文字列パラメータをconfig.filter_parameters
で指定すると、そのリクエストパスをクエリのログから除外できるようになりました。
to_param
するとnil
を返すURLパラメータは、クエリ文字列から削除されるようになりました。
パラメータをラップしてnestedハッシュにするActionController::ParamsWrapper
が追加されました。かつ、新しいアプリのJSONリクエストではこの機能がデフォルトでオンになります。config/initializers/wrap_parameters.rb
でカスタマイズできます。
config.action_controller.include_all_helpers
が追加されました。デフォルトでは、ActionController::Base
でhelper :all
が適用されます(デフォルトですべてのヘルパーを含む)。include_all_helpers
設定をfalse
にすると、application_helper
と、コントローラ名に対応するヘルパー(例: foo_controllerの場合はfoo_helper)だけが含まれます。
url_for
や名前付きURLヘルパーで:subdomain
オプションや:domain
オプションを指定できるようになりました。
Base.http_basic_authenticate_with
が追加されました。このクラスメソッドを1度呼び出すだけでシンプルなHTTP BASIC認証を行えます。
class PostsController < ApplicationController USER_NAME, PASSWORD = "dhh", "secret" before_filter :authenticate, :except => [ :index ] def index render :text => "ここは誰でも見える!" end def edit render :text => "ここはパスワードを知らないと見えない" end private def authenticate authenticate_or_request_with_http_basic do |user_name, password| user_name == USER_NAME && password == PASSWORD end end end
上のコードは以下のように書けます。
class PostsController < ApplicationController http_basic_authenticate_with :name => "dhh", :password => "secret", :except => :index def index render :text => "ここは誰でも見える!" end def edit render :text => "ここはパスワードを知らないと見えない" end end
ストリーミングのサポートが追加されました。有効にするには以下のようにします。
class PostsController < ActionController::Base stream end
:only
や:except
を用いてストリーミングを特定のアクションに限定できます。詳しくはActionController::Streaming
を参照してください。
ルーティングのredirect
メソッドが、対象URLの一部のみを変更するオプションハッシュを1つ受け取ることも、呼び出しに応答できるオブジェクト(リダイレクトで再利用できる)を1つ受け取ることもできるようになりました。
config.action_dispatch.x_sendfile_header
がデフォルトでnil
になりました。なおこの設定はconfig/environments/production.rb
にはデフォルトで値が設定されません。サーバーはX-Sendfile-Type
で値を設定できます。
ActionDispatch::MiddlewareStack
が「継承よりコンポジション」を採用し、配列を使わなくなりました。
acceptヘッダーを無視できるActionDispatch::Request.ignore_accept_header
が追加されました。
Rack::Cache
がデフォルトスタックに追加されました。
etagの責務がActionDispatch::Response
ミドルウェアスタックに移動しました。
Ruby世界全体との互換性を高めるAPIを含むRack::Session
依存するようになりました。これにより後方互換性が失われます。理由はRack::Session
が#get_session
で引数を4つ受け取ることを期待するのと、単なる#destroy
ではなく#destroy_session
が必須であるためです。
テンプレートが継承チェーンまで深く探索するようになりました。
:authenticity_token
オプションがform_tag
に追加されました。これはカスタムハンドリングに使ったり、:authenticity_token => false
を渡してトークンを省略したりできます。
ActionView::Renderer
を作成し、ActionView::Context
のAPIを指定しました。
SafeBuffer
をインプレースで改変することはRuby 3.1で禁止されました。
HTML5のbutton_tag
ヘルパーが追加されました。
file_field
に、:multipart => true
が自動的に同封フォームに追加されるようになりました。
オプションの:data
ハッシュでHTML5のdata-*
属性を追加するのに便利なイディオムがタグヘルパーに追加されました。
tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)}) # => <div data-name="Stephen" data-city-state="["Chicago","IL"]" />
キーはハイフンつなぎに変換され、値は文字列とシンボルを除いてJSONエンコードされます。
csrf_meta_tag
がcsrf_meta_tags
にリネームされ、後方互換性のためにcsrf_meta_tag
エイリアスが置かれました。
旧来のテンプレートハンドラAPIは非推奨となり、新しいAPIでは単にcallに応答するテンプレートハンドラが要求されるようになりました。
テンプレートハンドラのrhtmlやrxmlが最終的に削除されました。
テンプレートをキャッシュすべきかどうかを指定するconfig.action_view.cache_template_loading
が復活しました。
submitフォームヘルパーで"object_name_id"というidは今後生成されません。
FormHelper#form_for
で、:method
を:html
ハッシュではなく直接のオプションとして指定できるようになりました。form_for(@post, remote: true, html: { method: :delete })
ではなく、form_for(@post, remote: true, method: :delete)
のように指定します。
JavaScriptHelper#escape_javascript()
のエイリアスJavaScriptHelper#j()
が提供されました。これは、JSON gemがJavaScriptHelperを用いるテンプレート内に追加するObject#j()
メソッドに代わる後継メソッドとなります。
日時セレクタでAM/PM形式が利用できるようになりました。
auto_link
がRailsから削除され、rails_autolink gemに切り出されました。
個別のモデルのテーブル名を単数形や複数形にするpluralize_table_names
というクラスメソッドが追加されました。従来はActiveRecord::Base.pluralize_table_names
を用いて全モデルでグローバルにしか設定できませんでした。
class User < ActiveRecord::Base self.pluralize_table_names = false end
単一の関連付け(has_one
やbelongs_to
)に属性を設定するブロックが追加されました。このブロックはインスタンスが初期化された後に呼び出されます。
class User < ActiveRecord::Base has_one :account end user.build_account{ |a| a.credit_limit = 100.0 }
属性名のリストを返すActiveRecord::Base.attribute_names
が追加されました。抽象モデルの場合やモデルにテーブルがない場合は空の配列を返します。
CSVフィクスチャーが非推奨になりました。同サポートはRails 3.2.0で削除される予定です。
ActiveRecord#new
、ActiveRecord#create
、ActiveRecord#update_attributes
がすべてオプションハッシュをもう1つ取れるようになりました。この第2ハッシュを用いて、属性への代入時に考慮されるロールを指定できます。この機能は、Active Modelの新しいマスアサインメント機能の上に構築されます。
class Post < ActiveRecord::Base attr_accessible :title attr_accessible :title, :published_at, :as => :admin end Post.new(params[:post], :as => :admin)
default_scope
がブロックやlambdaや(遅延評価の呼び出しに応答する)任意のオブジェクトを1つ取れるようになりました。
デフォルトスコープが、可能な限り最新のタイミングで評価されるようになりました。これは、デフォルトスコープを含むスコープが暗黙で作成されるとModel.unscoped
を用いてスコープが削除できなくなることがある問題を回避するためのものです。
PostgreSQLアダプタでサポートされるPostgreSQLバージョンが8.2以降のみとなりました。
ConnectionManagement
ミドルウェアが変更され、rackの本体が破棄された後でコネクションプールをクリーンアップするようになりました。
Active Recordにupdate_column
メソッドが新たに追加されました。これはオブジェクト上で指定の属性を更新し、バリデーションやコールバックをスキップしますが、(updated_at
カラムの変更を含む)コールバックを一切実行したくない事情があるのでなければ、このupdate_column
ではなくupdate_attributes
かupdate_attribute
をおすすめします。新規レコードに対してupdate_column
メソッドを呼び出すべきではありません。
:through
オプションを用いる関連付けで、(:through
オプションとhas_and_belongs_to_many
関連付けの両方を持つ関連付けなどを含む)任意の関連付けをthrough関連付けやsource関連付けとして利用できるようになりました。
ActiveRecord::Base.connection_config
で現在のデータベース接続の設定にアクセスできるようになりました。
COUNTクエリでlimit
とoffset
を両方指定しない限り、LIMITとOFFSETが削除されるようになりました。
People.limit(1).count # => 'SELECT COUNT(*) FROM people' People.offset(1).count # => 'SELECT COUNT(*) FROM people' People.limit(1).offset(1).count # => 'SELECT COUNT(*) FROM people LIMIT 1 OFFSET 1'
ActiveRecord::Associations::AssociationProxy
が分割されました。Association
クラス(およびサブクラス)は関連付けへの操作を担当し、それとは別のCollectionProxy
というラッパーはコレクション関連付けをプロキシします。これによって名前空間の汚染を防止し、concernsが分離されるので、リファクタリングをさらに進められるようになります。
単一の関連付け(has_one
やbelongs_to
)にプロキシが含まれなくなり、関連付けられたレコードかnil
のいずれかを単に返すようになりました。これは、bob.mother.create
のようなドキュメントのないメソッドを使うべきではないという意図を表しています。今後はbob.create_mother
などをお使いください。
has_many :through
関連付けで:dependent
オプションがサポートされるようになりました。通常のhas_many関連付けでは:nullify
がデフォルトの削除ストラテジーですが、歴史的な理由と実用上の理由によって、association.delete(*records)
の:delete_all
がデフォルトの削除ストラテジーとなっています。また、この機能をすべて使えるのは、ソースリフレクションがbelongs_toの場合に限られます。それ以外の場合は、through関連付けを直接変更すべきです。
has_and_belongs_to_many
やhas_many :through
におけるassociation.destroy
の振る舞いが変更されました。今後、ある関連付けにおけるdestroyやdeleteは、「関連付けられたそのレコードを必ず削除する」ではなく、「そのリンクを削除する」と認識されます。
従来のhas_and_belongs_to_many.destroy(*records)
はレコードそのものをdestroyし、joinテーブルのレコードは削除しませんでした。今後はjoinテーブルのレコードを削除します。
従来のhas_many_through.destroy(*records)
はレコードそのものをdestroyし、joinテーブルのレコードは削除しませんでした[メモ: これは常にそうとは限りませんでした。従来バージョンのRailsではレコードそのものだけが削除されました]。今後はjoinテーブルのレコードだけを削除します。
この変更によって後方互換性がある程度失われますが、残念ながら、この変更を実施する前に「非推奨化する」方法がありません。この変更は、さまざまな関連付けの種類全体でdestroyやdeleteの意味を統一するために実施中です。レコードそのものをdestroyしたい場合はrecords.association.each(&:destroy)
が使えます。
:bulk => true
オプションがchange_table
に追加されました。これはあらゆるスキーマ変更を、ブロック内で1つのALTERステートメントを用いて定義します。
change_table(:users, :bulk => true) do |t| t.string :company_name t.change :birthdate, :datetime end
has_and_belongs_to_many
のjoinテーブルで属性にアクセスするためのサポートが削除されました。has_many :through
を利用する必要があります。
create_association!
メソッドが追加されました。has_one
関連付けやbelongs_to
関連付けで利用できます。
マイグレーションがリバース(巻き戻し)可能になりました。つまりRailsがマイグレーションをリバースする方法を認識できるということです。リバース可能なマイグレーションを利用するには、以下のように単にchange
メソッドを定義します。
class MyMigration < ActiveRecord::Migration def change create_table(:horses) do |t| t.column :content, :text t.column :remind_at, :datetime end end end
自動的にはリバース可能にならないものもあります。リバースする方法を自分が知っているのであれば、マイグレーションでup
やdown
を定義すべきです。change
の中にリバースできないものがあると、リバース中にIrreversibleMigration
例外が発生します。
マイグレーションで、クラスメソッドではなくインスタンスメソッドが使われるようになりました。
class FooMigration < ActiveRecord::Migration def up # self.upではなくなった ... end end
モデルから生成したマイグレーションファイルや、構成可能なマイグレーションジェネレータで生成したマイグレーションファイル(add_name_to_usersなど)で、通常のup
メソッドやdown
メソッドではなく、リバース可能なchange
メソッドが使われるようになりました。
関連付けで文字列のSQL条件を展開する機能のサポートが削除されました。今後はproc
を使うべきです。
has_many :things, :conditions => 'foo = #{bar}' # 従来 has_many :things, :conditions => proc { "foo = #{bar}" } # 今後
proc
の内部では、関連付けをeager loadingしない限り、関連付けのオーナーはself
というオブジェクトになります。ここでself
は、関連付けを含んでいるクラスを表します。
proc
の内部では「通常の」条件を何でも使えるので、以下も機能します。
has_many :things, :conditions => proc { ["foo = ?", bar] }
従来はhas_and_belongs_to_many
関連付けの:insert_sql
メソッドや:delete_sql
メソッドで「レコード」を呼び出すことで、挿入されるレコードや削除されるレコードを取得できました。今後これらのレコードは引数としてそのprocに渡されるようになりました。
ActiveRecord::Base#has_secure_password
(ActiveModel::SecurePassword
を利用)が追加されました。BCrypt暗号化やsalt追加が使える極めてシンプルなパスワード利用機能がこのメソッドにカプセル化されています。
# Schema: User(name:string, password_digest:string, password_salt:string) class User < ActiveRecord::Base has_secure_password end
モデルを生成するときに、belongs_to
やreferences
カラムにデフォルトでadd_index
が追加されるようになりました。
belongs_to
オブジェクトのidを設定すると、そのオブジェクトの参照が更新されるようになりました。
ActiveRecord::Base#dup
やActiveRecord::Base#clone
のセマンティクス(意味付け)が変更され、Rubyの通常のdup
やclone
のセマンティクスに近くなりました。
ActiveRecord::Base#clone
を呼ぶと、frozenされたステートのコピーを含むレコードの浅い(shallow)コピーが返されます。コールバックは呼ばれません。
ActiveRecord::Base#dup
を呼ぶとレコードが複製され、after_initializeフックも呼び出されます。frozenなステートはコピーされず、関連付けはすべてクリアされます。dup
されたレコードはnew_record?
でtrue
を返し、idフィールドはnil
に設定され、かつ保存可能になります。
クエリキャッシュがprepared statementで使えるようになりました。アプリケーションの変更は不要です。
attr_accessible
で:as
オプションを用いてロールを指定できるようになりました。
InclusionValidator
、ExclusionValidator
、FormatValidator
が、ブロックやlambda、またはcall
に応答する任意のオブジェクトをオプションとして1つ取れるようになりました。このオプションは現在のレコードを引数として呼び出され、InclusionValidator
やExclusionValidator
の場合はinclude?
に応答するオブジェクトを1つ返し、FormatValidator
の場合は正規表現オブジェクトを1つ返します。
ActiveModel::SecurePassword
が追加されました。BCrypt暗号化やsalt追加が使える極めてシンプルなパスワード利用機能がこのメソッドにカプセル化されています。
ActiveModel::AttributeMethods
で属性を必要に応じて定義できるようになりました。
オブザーバー(observer)を選択的に有効にしたり無効にしたりする機能が追加されました。
I18n
名前空間を交互に探索する機能はサポートされなくなりました。
すべてのリクエストでデフォルトのフォーマットがJSONに変更されました。XMLを使い続けたい場合は、次のようにこのクラスでself.format = :xml
を設定する必要があります。
class User < ActiveResource::Base self.format = :xml end
ActiveSupport::Dependencies
で既存の定数がload_missing_constant
にある場合にNameError
をraiseするようになりました。
レポート用メソッドKernel#quietly
が新たに追加されました。これはSTDOUT
とSTDERR
を両方とも抑制します。
String#inquiry
が追加されました。これは文字列をStringInquirer
オブジェクトに変換するのに便利です。
Object#in?
が追加されました。これはオブジェクトが別のオブジェクトに含まれているかどうかをテストします。
LocalCache
ストラテジーが、無名クラスではなくミドルウェアに実在するクラスになりました。
ActiveSupport::Dependencies::ClassCache
クラスが導入されました。再読み込み可能なクラスへの参照がこのクラスに保持されます。
ActiveSupport::Dependencies::Reference
がリファクタリングされ、新しいClassCache
を直接利用するようになりました。
Range#cover?
がRuby 1.8のRange#include?
のエイリアスとしてバックポートされました。
Date/DateTime/Timeにweeks_ago
とprev_week
が追加されました。
before_remove_const
コールバックがActiveSupport::Dependencies.remove_unloadable_constants!
に追加されました。
非推奨化:
ActiveSupport::SecureRandom
が非推奨化されました。今後はRuby標準ライブラリのSecureRandom
が推奨されます。Railsを頑丈かつ安定したフレームワークにするために多大な時間を費やしてくださった多くの開発者については、Railsコントリビューターの完全なリストを参照してください。これらの方々全員に敬意を表明いたします。
Rails 3.1リリースノートの編集はVijay Devが担当しました。
Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。
原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨
本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。
Railsガイド運営チーム (@RailsGuidesJP)
Railsガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。