Rails 3自定义路由无法通过* _path方法识别

时间:2012-01-20 10:34:33

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

有没有办法确保*_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方法识别?

1 个答案:

答案 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