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

Rails 7.1: url_forヘルパーにpath_paramsオプションが追加(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

参考: 週刊Railsウォッチ20230621: url_forヘルパーに新しいpath_paramsオプションが追加

Rails 7.1: url_forヘルパーにpath_paramsオプションが追加(翻訳)

Rails 7.1のurl_forヘルパーで、path_paramsという新しいオプションがサポートされました。

Rails 7.1より前は、ルーティングで以下で示すようにscopeでたとえばuser_idを指定している場合、このスコープ付きルーティングのリンクを生成するすべての場所で(ビューファイルを書くときなど)、user_idを明示的に指定しなければなりませんでした。

#routes.rb
Rails.application.routes.draw do
  root "articles#index"

  scope ":user_id" do
    get "/articles", to: "articles#index"
    get "/articles/:id", to: "articles#show"
  end

  get "/categories", to: "categories#index"
end
<!-- app/views/articles/index.html.erb -->

<a href="<%= articles_path(user_id: @current_user.id) %>"> Articles </a>

これは、ApplicationControllerを更新してdefault_url_optionsメソッドを上書きすれば一応解決できます。

# application_controller.rb
class ApplicationController < ActionController::Base
  def default_url_options
    { user_id: "unique-id" }
  end
end

このdefault_url_optionsメソッドは、url_forに基づくすべてのメソッドについてデフォルトオプションを上書きするのに使われます。ただしこれを行うと、user_idスコープに属していないルーティングも含め、すべてのルーティングの末尾に?user_id=unique-idクエリパラメータが追加されてしまい、結果は以下のようになります。

articles_path # => /unique-id/articles
categories_path # => /categories?user_id=unique-id

Rails 7.1では、url_forpath_paramsオプションを追加することでこの問題を修正しました。パラメータのハッシュをキーに渡すと、それらのパラメータはルーティングの名前付きセグメントでのみ使われるようになります。パラメータが使われない場合は破棄されるので、クエリパラメータとしてルーティングの末尾に追加されることはありません。

この変更によって、default_url_optionsメソッドを以下のように実装できるようになります。

class ApplicationController < ActionController::Base
  def default_url_options
    { path_params: { user_id: "unique-id" } }
  end
end

url_forヘルパーメソッドによって、以下の出力が得られます。

articles_path # => /unique-id/articles
articles_path(user_id: "test-id") # => /test-id/articles
categories_path # => /categories
categories_path(user_id: "test-id") # => /categories

これで、ビューで以下のようにuser_idを書かずに済むようになります。

<a href="<%= articles_path %>"> Articles </a>

これは、他のルーティングに不要なクエリパラメータを追加せずに、ルーティングURLの一部として必須パラメータだけを追加したい場合に非常に便利です。

詳しくは#43770を参照してください。

関連記事

Rails 8: 組み込みのレート制限APIを導入(翻訳)

Rails: Solid Queueで重要なUPDATE SKIP LOCKEDを理解する(翻訳)


CONTACT

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