url_for在构建路径时使用to_param

时间:2010-07-02 01:42:07

标签: ruby-on-rails routes custom-routes

在选择使用哪条路线时,我无法将url_for渲染到to_param中。

我有两组使用相同模型的路线(Foo)。如果是Foo.is_special,则url应映射到/ special /:action。如果不是,则应映射到/:id /:action。因为它是相同的模型,我希望url_for自动知道要映射到哪条路径,具体取决于is_special。

routes.rb中:

map.special 'special/:action', :controller => 'bar', :id => 'special'
map.regular ':id/:action', :controller => 'bar', :id => /\d+/

foo.rb:

def to_param
   is_special ? 'special' : id.to_s
end

这在我明确设置:id时有效。例如:

url_for(:controller => 'bar', :id => 'special')
url_for(:controller => 'bar', :id => @foo)

为特殊情况生成正确的url:id显式设置为'special',以及@foo is_special == false时。但是,当@ foo.is_special == true时,无法识别特殊路径。

2 个答案:

答案 0 :(得分:1)

不确定这是否是预期的行为,但这有效:

map.special ':id/:action', :controller => 'bar', :id => 'special'

而不是

map.special 'special/:action', :controller => 'bar', :id => 'special'

答案 1 :(得分:0)

是的,将调用to_param将@foo翻译成字符串。你确定它没有被调用吗?也许问题出在其他地方。在控制台中尝试以确保它。要在控制台中测试路线,您可以先输入

包括ActionController :: UrlWriter; default_url_options [:host] ='localhost:3000'