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の変更点のひとつです。これにより、サーバーがレスポンス生成の途中でもスタイルシートや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がすべてオプションハッシュをもうひとつ取れるようになりました。この第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 statmentで使えるようになりました。アプリケーションの変更は不要です。
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ガイドは下記の協賛企業から継続的な支援を受けています。支援・協賛にご興味あれば協賛プランからお問い合わせいただけると嬉しいです。