🔗 Action Pack CHANGELOG
参考: Release 8.1.0.beta1 · rails/rails
参考: コミットリスト: Comparing v8.0.2.1...v8.1.0.beta1 · rails/rails
🔗 Remove deprecated support to a route to multiple paths · rails/rails@d1f523d
ルーティングに複数のパスを書ける記法(非推奨化)のサポートを削除。
Rafael Mendonça França
同Changelogより
参考: Deprecate multiple path route mapping by gmcgibbon · Pull Request #52409 · rails/rails
# #52409より
# 変更前
get "/users", "/other_path", to: "users#index"
# 変更後
get "/users", to: "users#index"
get "/other_path", to: "users#index"
🔗 Remove deprecated support for using semicolons as a query string sepa… · rails/rails@25e4b06
クエリ文字列をセミコロン
;
で区切るサポート(非推奨化)を削除。変更前:
ActionDispatch::QueryParser.each_pair("foo=bar;baz=quux").to_a # => [["foo", "bar"], ["baz", "quux"]]
変更後:
ActionDispatch::QueryParser.each_pair("foo=bar;baz=quux").to_a # => [["foo", "bar;baz=quux"]]
Rafael Mendonça França
同Changelogより
これはRackに関連する以下の非推奨化の削除です。
参考: Maintain Rack 2 parameter parsing behaviour by matthewd · Pull Request #53471 · rails/rails
🔗 Remove deprecated support to skipping over leading brackets in parame… · rails/rails@303b8f7
パラメータパーサーがパラメータ名に含まれる冒頭の
[]
を削除するサポート(非推奨)を削除。変更前:
ActionDispatch::ParamBuilder.from_query_string("[foo]=bar") # => { "foo" => "bar" } ActionDispatch::ParamBuilder.from_query_string("[foo][bar]=baz") # => { "foo" => { "bar" => "baz" } }
変更後:
ActionDispatch::ParamBuilder.from_query_string("[foo]=bar") # => { "[foo]" => "bar" } ActionDispatch::ParamBuilder.from_query_string("[foo][bar]=baz") # => { "[foo]" => { "bar" => "baz" } }
Rafael Mendonça França
同Changelogより
これもRackに関連する以下の非推奨化の削除です。
参考: Maintain Rack 2 parameter parsing behaviour by matthewd · Pull Request #53471 · rails/rails
🔗 Remove deprecated support to skipping over leading brackets in parame… · rails/rails@303b8f7
Rails.application.config.action_dispatch.ignore_leading_brackets
を非推奨化。Rafael Mendonça França
同Changelogより
これもRackに関連する以下の非推奨化の削除です。
参考: Maintain Rack 2 parameter parsing behaviour by matthewd · Pull Request #53471 · rails/rails
なお、このRails.application.config.action_dispatch.ignore_leading_brackets
は今のところガイドに掲載されていません。
🔗 RateLimiting: raise ActionController::TooManyRequests
error by seanpdoyle · Pull Request #55501 · rails/rails★
ActionController::RateLimiting
でActionController::TooManyRequests
をraiseするようになった。
レートリミットを超えたリクエストで
ActionController::TooManyRequests
エラーをraiseするようになった。
デフォルトではエラーをrescue
してHTTPステータス429 Too Many Requests
でレスポンスを返す。Sean Doyle
同Changelogより
参考: 429 Too Many Requests - HTTP | MDN
🔗 Add markdown mime type and renderer by dhh · Pull Request #55511 · rails/rails
.md
と.markdown
をmarkdown用の拡張子として追加し、デフォルトのmarkdown:
を追加した。class Page def to_markdown body end end class PagesController < ActionController::Base def show @page = Page.find(params[:id]) respond_to do |format| format.html format.md { render markdown: @page } end end end
DHH
同Changelogより
markdownサポートは、Rails World 2025で発表された機能です。
🔗 Add headers to engine route inspection command by p8 · Pull Request #55550 · rails/rails
rails routes
コマンドでエンジンのルーティングにも見出し(Prefix
、Verb
、URI Pattern
、Controller#Action
)を表示するようになった。Petrik de Heus
同Changelogより
Routes for Blorgh::Engine:
Prefix Verb URI Pattern Controller#Action
articles GET /articles(.:format) blorgh/articles#index
...
🔗 Add Copy as Text button to error pages by mikker · Pull Request #55431 · rails/rails
Railsのエラーページに"Copy as text"を追加した。
Mikkel Malmberg
同Changelogより
🔗 Rate Limiting: Allow to define shared rate limit across controllers. by arthurwozniak · Pull Request #53449 · rails/rails★
rate_limit
メソッドにscope:
オプションを追加した。これにより、レート制限を複数のコントローラで共有可能になった。従来は、レート制限のデフォルト値がコントローラごとに分離されていたため、レート制限を複数のコントローラで共有できなかった。
改修後は、
scope:
オプションでこの問題が解決された。class APIController < ActionController::API rate_limit to: 2, within: 2.seconds, scope: "api" end class API::PostsController < APIController # ... end class API::UsersController < APIController # ... end
ArthurPV, Kamil Hanus
同Changelogより
ベースコントローラでscope:
オプションが定義されていない場合は、rate_limit
の設定が他のコントローラと共有されます。
🔗 Add support for rack.response_finished
callbacks in ActionDispatch::Executor
by adrianna-chang-shopify · Pull Request #55425 · rails/rails
ActionDispatch::Executor
にrack.response_finished
コールバック用のサポートを追加。
リクエストライフサイクルの完了コールバックをRackの
rack.response_finished
メカニズムで先延ばしする機能がexecutorミドルウェアでサポートされるようになった。これにより、アプリケーションでexecutorの完了コールバックでクリーンアップされる状態に依存するrack.response_finished
コールバックを定義可能になった。Adrianna Chang, Hartley McGuire
同Changelogより
🔗 Log when rescue_from handles an exception by swebb · Pull Request #55424 · rails/rails
rescue_from
が呼び出されたときにログを生成するようになった。これにより例外をトラッキングしやすくなる。Steven Webb, Jean Boussier
同Changelogより
🔗 Allow hosts redirects from hosts
Rails configuration by byroot · Pull Request #55420 · rails/rails
Railsの
hosts
設定からのhostsのリダイレクトをallowed_redirect_hosts
設定で行えるようになった。config.action_controller.allowed_redirect_hosts << "example.com"
Kevin Robatel
同Changelogより
リダイレクトを許可するhostsは配列で複数設定できます。なお、従来はUnsafeRedirectError
がraiseされました。
🔗 rate_limit notification instrumentation to include more payload by jrochkind · Pull Request #55418 · rails/rails
rate_limit.action_controller
の通知に以下のペイロードが追加された。
count
to
within
by
name
cache_key
Jonathan Rochkind
同Changelogより
🔗 Add render json to health by francesco-loreti · Pull Request #55092 · rails/rails
Rails組み込みのhealthコントローラでJSONを利用可能になった。
Railsのhealthコントローラが、JSONリクエストに対してステータスやタイムスタンプ情報を含む構造化されたレスポンスを返すようになった。
これにより、ヘルスチェックデータを監視ツールやロードバランサーでプログラム的に利用しやすくなった。# /up.json { "status": "up", "timestamp": "2025-09-19T12:00:00Z" }
Francesco Loreti, Juan Vásquez
同Changelogより
🔗 Add support to open files in the source code editor from the crash page by igorkasyanchuk · Pull Request #55295 · rails/rails
ブラウザのクラッシュページでファイルオープンダイアログを開けるようになった。
Igor Kasyanchuk
同Changelogより
🔗 Fix errors when querystring keys have invalid encoding by cmitz · Pull Request #55319 · rails/rails
クエリの文字列キーでエンコードが有効かどうかを常にチェックするよう修正された(クエリの値については既にチェックするようになっている)。
Casper Smits
同Changelogより
🔗 Fix {Public,Debug}Exceptions rendering body for HEAD by skipkayhil · Pull Request #55149 · rails/rails
HEADリクエストで
PublicExceptions
やDebugExceptions
がraiseされたときに常に空のbodyを返すよう修正された。この振る舞いは
Rack::Lint
で要請されている(RFC9110)。Hartley McGuire
同Changelogより
🔗 Add support for Cache-Control request directives by egg528 · Pull Request #55033 · rails/rails
RFC 9111に準拠するため、HTTP
Cache-Control
リクエストディレクティブの包括的なサポートを追加。リクエストのキャッシュディレクティブにアクセスする
request.cache_control_directives
オブジェクトが提供される。# ブーリアンのディレクティブ request.cache_control_directives.only_if_cached? # => true/false request.cache_control_directives.no_cache? # => true/false request.cache_control_directives.no_store? # => true/false request.cache_control_directives.no_transform? # => true/false # 値ディレクティブ request.cache_control_directives.max_age # => integer or nil request.cache_control_directives.max_stale # => integer or nil (or true for valueless max-stale) request.cache_control_directives.min_fresh # => integer or nil request.cache_control_directives.stale_if_error # => integer or nil # max-stale用の特殊ヘルパー request.cache_control_directives.max_stale? # => true if max-stale present (with or without value) request.cache_control_directives.max_stale_unlimited? # => true only for valueless max-stale
利用例:
def show if request.cache_control_directives.only_if_cached? @article = Article.find_cached(params[:id]) return head(:gateway_timeout) if @article.nil? else @article = Article.find(params[:id]) end render :show end
egg528
同Changelogより
参考: Cache-Control
- HTTP | MDN
🔗 Add assert_in_body/assert_not_in_body by dhh · Pull Request #54938 · rails/rails
assert_in_body
とassert_not_in_body
を追加。短いテキストがレスポンスのbodyに含まれているかどうかを最も手軽にチェックできる。DHH
同Changelogより
🔗 Include cookie name in length calculation by skipkayhil · Pull Request #54843 · rails/rails
Cookiesミドルウェアでcookieの最大長さを算出するときにcookie名も含めるよう修正。
Hartley McGuire
同Changelogより
🔗 Add must-understand
directive by heka1024 · Pull Request #54833 · rails/rails
RFC 9111に準拠するため、
must-understand
ディレクティブを実装。
must-understand
ディレクティブは、キャッシュがレスポンスのステータスコードの意味を適切に理解して適切に処理しなければならないことと、それ以外の場合はレスポンスを破棄することを示す。キャッシュが正しく振る舞うために、このディレクティブはno-store
とのみ併用する必要がある(つまりキャッシュが決して保存されない状況以外では使ってはならない)。class ArticlesController < ApplicationController def show @article = Article.find(params[:id]) if @article.special_format? must_understand render status: 203 # Non-Authoritative Information else fresh_when @article end end end
heka1024
同Changelogより
参考: Cache-Control
- HTTP | MDN
🔗 Don't always escape JSON when calling render json:
by etiennebarrie · Pull Request #54643 · rails/rails★
JSONレンダラーがHTMLエンティティやUnicodeの行区切り文字をエスケープしないよう修正された。
render json:
で以下の文字をエスケープしなくなった。これらの文字がJSONで生成されてJavaScriptに埋め込まれるとエラーになったり、生成されたJSONがHTMLに埋め込まれると脆弱性の原因になったりする可能性がある。
レンダラーはJSONドキュメントを
application/json
として返すために使われるので、通常はこれらの文字をエスケープする必要はなく、エスケープをやめることでパフォーマンスも向上する。
:callback
オプションが設定されている場合は、JSONがJavaScriptコード(JSONP)として使われるため、引き続きエスケープされる。以下のように
:escape: true
オプションを指定するか、config.action_controller.escape_json_responses
コンフィグをtrue
に設定することで、従来のエスケープ動作を復元できる。class PostsController < ApplicationController def index render json: Post.last(30), escape: true end end
Étienne Barrié, Jean Boussier
同Changelogより
escape_json_responses
は以下で非推奨化されました。
🔗 Load lazy route set before inserting test routes by gmcgibbon · Pull Request #54777 · rails/rails
ルーティングセットの遅延読み込みがテスト用ルーティングの挿入より前のタイミングで行われるよう修正。
ルーティングセットが早い段階で遅延読み込みされないと、
after_routes_loaded
コールバックが呼び出されなくなったり、Railsエンジンによって別の読み込みがトリガーされたときに本物のルーティングではなくテスト用のルーティングが呼び出されるリスクが生じる。Gannon McGibbon
同Changelogより
🔗 Raise DoubleRenderError
on head
after rendering by viralpraxis · Pull Request #54655 · rails/rails★
レンダリング後に
head
が呼び出されるとAbstractController::DoubleRenderError
をraiseするよう修正。この変更後は、レスポンスのbodyが設定済みの状態で
head
を呼ぶとエラーになる。class PostController < ApplicationController def index render locals: {} head :ok end end
Iaroslav Kurbatov
同Changelogより
参考: 週刊Railsウォッチ20250409 -- レンダリング後にheadを呼び出すとraiseするようになった
🔗 Add SafeBuffer to the list of messagepack serializable type: by Edouard-chin · Pull Request #54584 · rails/rails
Cookie Serializerは、
MessagePack
を使うときにActive SupportのSafeBuffer
をシリアライズするようになった。従来は、アプリケーションがCookie SerializerにMessagePackを利用していると以下のようなコードがエラーになった。
class PostController < ApplicationController def index flash.notice = t(:hello_html) # この場合SafeBufferを使おうとするが利用できなかった end end
Edouard Chin
同Changelogより
参考: §3.14.9 config.active_support.message_serializer
-- Rails アプリケーションの設定項目 - Railsガイド
🔗 Fix routes being cleared when using reload_routes!
: by Edouard-chin · Pull Request #54306 · rails/rails
Rails.application.reload_routes!
を実行するとほとんどのルーティングがクリアされてしまう問題を修正。Rakeタスクのミドルウェア内で
Rails.application.reload_routes!
を呼び出すと、特定の状況下でルーティングをすべて消してしまうことが可能になっていた。
これをミドルウェア内で実行すると、アクセスしたほとんどのページで404エラーが発生していた。
なお、この問題はdevelopment環境でのみ発生していた。Edouard Chin
同Changelogより
🔗 [Fix #54134] Add resource name to the ArgumentError
that's raised when invalid :only
or :except
options are given to #resource
or #resources
by jagthedrummer · Pull Request #54163 · rails/rails
ルーティングの
#resource
メソッドや#resources
メソッドに渡した:only
オプションや:except
オプションが無効だった場合にraiseされるArgumentError
にリソース名を含めるようになった。これによって、特にgemで設定されたルーティングの問題発生場所を特定しやすくなる。
改修前:
:only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
改修後:
Route `resources :products` - :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
Jeremy Green
同Changelogより
🔗 Return a 500 on MissingController errors by byroot · Pull Request #53964 · rails/rails★
存在しないコントローラを指すルーティングで発生するエラーを404から500に変更した。
コントローラが存在しない場合のエラーは、404を返すルーティングエラーではなく、プログラミングエラーとして500を返すべき。
最近までルーティングで動的な
:controller
セグメントがサポートされていたため、この問題の解明が困難だったが、これが非推奨化されてRails 8.1で削除される予定となったため、コントローラの不在をルーティングエラーとして扱わないようにすることが容易になった。Jean Boussier
同Changelogより
参考: §4.1 利用するコントローラを指定する -- Rails のルーティング - Railsガイド
🔗 Add an option to ensure uniqueness of newly generated session IDs in Session::CacheStore
by riseshia · Pull Request #53918 · rails/rails
ActionDispatch::Session::CacheStore
にcheck_collisions
オプションが追加された。新しく生成されるセッションidのランダムネスは128ビットになる。これは衝突の発生を防ぐには十分だが、セッションをさらに強化する必要がある場合は、この
check_collisions
オプションを有効にすることでセッションストアでidに空きがあるかどうかをチェックできる。ただし、このオプションを有効にすると、セッション作成時に追加の書き込みが発生する。
Shia
同Changelogより
🔗 Improve error highlighting of multiline methods in ERB templates by martinemde · Pull Request #53763 · rails/rails
ExceptionWrapper
でバックトレース行とビルド済みテンプレートがなるべく一致するよう改善された。これにより、テンプレートのdo
-end
ブロック内でのエラーハイライト表示が改善される。これは、Ruby 3.4環境下のエラーハイライト表示で、バックトレース内の新しいメソッドラベルと一致させるための修正。
Martin Emde
同Changelogより
🔗 Don't parse response content type if value comes from Mime by p8 · Pull Request #53236 · rails/rails
Content-TypeのMIMEタイプをシンボルでも指定可能になった。
# 改修前 response.content_type = "text/html" # 改修後 response.content_type = :html
Petrik de Heus
同Changelogより
breaking changesの可能性があるプルリク・コミット
個別のプルリクにも目印として★を追加しています。