我遇到了类似于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,并将位置参数应用于剩余的路径段。任何关于它为什么不这样做的见解,或者我必须做什么才能获得我想要的行为?
编辑:我不再确定是导致错误的可选路径段,而不是路由通配符。我以为我之前在单个可选路径段上重现了这个错误,但我最近的试验有可选段的行为不同,具体取决于它们是否包含 *。无论如何,我仍然对此感到好奇,但实际上我决定放弃 url_options 以支持传递显式参数。