default_url_options と rails 3に似た問題があります。一番上の回答で説明されているソリューションを実装しようとしています。
class ApplicationController < ActionController::Base
def url_options
{ :profile => current_profile }.merge(super)
end
end
routes.rb 内 (NDA を保護するために名前が変更されています):
scope ":profile" do
match "/:comment" => "comments#show", :as => :show_comment
match "/comments(/*comments)" => "comments#index", :as => :show_many_comments
end
URLヘルパーで私が遭遇している問題は次のとおりです。
show_comment_path(comment) #=> "/current_profile/comment"
それは期待どおりに機能します。ただし、オプションのセグメントを含むルートでは中断されます。
show_many_comments_path([comment1, comment2])
収量
No route matches {:profile=>[comment1, comment2], :controller=>"comments", :action=> "index"}
ただし、名前付き引数ではなく位置引数を使用した場合にのみ壊れます。言い換えると:
show_many_comments_path(:comments => [comment1, comment2]) #=> "/current_profile/comments/comment1/comment2"
予想通り。したがって、唯一のエラー ケースは、位置引数とオプションのパス セグメントを使用する場合です。
ActionDispatch のソース コードを調べましたが、なぜこれが起こっているのかわかりません。明示的な :profile を提供したことを確認し、残りのパス セグメントに位置引数を適用することは十分に賢明であるように見えます。なぜそうしないのか、または私が望む動作を得るために何をしなければならないのかについての洞察はありますか?
編集:ルートのグロビングとは対照的に、エラーを引き起こしているのはオプションのパスセグメントであるかどうかはわかりません。以前にこのエラーを 1 つのオプション パス セグメントで再現したと思っていましたが、最近の試行ではオプション セグメントが * を含むかどうかに基づいて動作が異なります。いずれにせよ、私はまだこれについて興味がありますが、実際の問題として、明示的なパラメーターを渡すことを優先して url_options を廃棄することにしました。