3

我遇到了类似于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 以支持传递显式参数。

4

1 回答 1

0

复制评论中的答案,以便从“未回答”过滤器中删除此问题:

我看到你用 3.0.11 描述的确切错误。好消息是最新版本似乎没有它。在 3.2.6 和 3.2.2 上按预期工作

〜回答每个Serge Balyuk

于 2013-10-09T06:20:43.287 回答