0

在选择要使用的路线时,我无法让 url_for 呈现 to_param 。

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

路线.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)

当 :id 显式设置为 'special' 并且 @foo is_special == false 时,生成正确的特殊 URL。但是,当 @foo.is_special == true 时,无法识别特殊路线。

4

2 回答 2

1

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

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

代替

map.special 'special/:action', :controller => 'bar', :id => 'special'
于 2010-07-05T19:17:58.700 回答
0

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

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

于 2010-07-02T09:23:06.637 回答