有没有办法确保*_path
方法识别自定义路由?
我有一个资源,以及到同一个控制器的自定义路由:
resources :news, :only => [:index, :show], :path => :nieuws
match '/nieuws/:cat/:id/:slug', :to => 'news#show'
match '/nieuws/:id/:slug', :to => 'news#show'
这工作正常,请求http://www.example.com/nieuws/category/1/slug
时会显示正确的新闻项。问题是我想使用news_path
方法链接到我的新闻项目。为此,我将以下代码添加到我的新闻项目模型中:
def to_param
if news_category
"#{news_category.slug}/#{id}/#{slug}"
else
"#{id}/#{slug}"
end
end
当不使用/
分隔cat,id和slug时,它可以正常工作,但是当使用/
时,news_path方法失败并显示所请求的页面:
No route matches {:action=>"show", :controller=>"news", :id=>#<NewsItem id: 1...etc
我的rake routes
输出:
news_index GET /nieuws(.:format) {:action=>"index", :controller=>"news"}
news GET /nieuws/:id(.:format) {:action=>"show", :controller=>"news"}
/nieuws/:cat/:id/:slug(.:format) {:controller=>"news", :action=>"show"}
/nieuws/:id/:slug(.:format) {:controller=>"news", :action=>"show"}
我已经尝试将, :id => /[0-9]+\/.+/
添加到资源路由的末尾,这样可以使用/
,但因为它只使用了正则表达式而我无法获取:cat
URL中的参数
那么,有没有办法确保我的自定义路由被news_path
方法识别?
答案 0 :(得分:0)
我认为您正在以不应该使用的方式使用to_param
。如果你有to_param
方法,那么应该有一个from_param
方法作为查找器,它应该始终映射到一个标记而不是一个路径。所以即"#{news_category.slug}-#{id}-#{slug}"
而不是"#{news_category.slug}/#{id}/#{slug}"
。
如果你不想按路径段分开,你需要将它放入news_path
这样的呼叫:
news_path(news, :cat => news_category.slug, :slug => slug)
请参阅指南以获取更多建议:http://guides.rubyonrails.org/routing.html#segment-constraints