我遇到了与default_url_options and 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
现在这里是我遇到网址助手的问题。
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而转而使用显式参数。
答案 0 :(得分:0)