在Rails 3.0.11中将url_options添加到url_for

时间:2012-08-23 13:37:49

标签: ruby-on-rails ruby-on-rails-3

我遇到了与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而转而使用显式参数。

1 个答案:

答案 0 :(得分:0)

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

  

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

〜每Serge Balyuk

回答