Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 8.1.0.beta1のChangelog: Action Pack(全項目リンク付き)

🔗 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::RateLimitingActionController::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で発表された機能です。

速報: Rails World 2025のDHHキーノートとRails 8.1beta1リリース

🔗 Add headers to engine route inspection command by p8 · Pull Request #55550 · rails/rails

rails routesコマンドでエンジンのルーティングにも見出し(PrefixVerbURI PatternController#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

ArthurPVKamil 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::Executorrack.response_finishedコールバック用のサポートを追加。

リクエストライフサイクルの完了コールバックをRackのrack.response_finishedメカニズムで先延ばしする機能がexecutorミドルウェアでサポートされるようになった。これにより、アプリケーションでexecutorの完了コールバックでクリーンアップされる状態に依存するrack.response_finishedコールバックを定義可能になった。

Adrianna ChangHartley McGuire
同Changelogより

🔗 Log when rescue_from handles an exception by swebb · Pull Request #55424 · rails/rails

rescue_fromが呼び出されたときにログを生成するようになった。これにより例外をトラッキングしやすくなる。

Steven WebbJean 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 LoretiJuan 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リクエストでPublicExceptionsDebugExceptionsが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_bodyassert_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::CacheStorecheck_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より

関連記事

速報: Rails World 2025のDHHキーノートとRails 8.1beta1リリース

Rails 8.0 Changelog(全項目リンク付き)

Rails 7.2.0 Active Storage CHANGELOG(全項目リンク付き)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。