Rails在不使用链接ID的情况下匹配带有slugs的路由

时间:2012-07-06 02:49:07

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

在我的路线文件中,我可以很容易地将一个看起来像这样的匹配放在一起并且工作得很好

match '/:slug/:id' => "pages#show", :id => :id

视图中的链接是

link_to n.name, "/" + n.slug + "/" + n.id.to_s

我宁愿不在网址中包含ID号,所以我希望做一些像

这样的事情
match '/:slug' => "pages#show", :slug => :slug

但问题是这个没有提供显示控制器页面的id。有没有办法使用:slug将它与数据库中的页面匹配,使用此slug查找:id所以我可以将:id传递给控制器​​?

3 个答案:

答案 0 :(得分:6)

在您的路线中使用此

match "/:slug" => "pages#show"

在您的控制器中使用此

按slug查找页面
@page = Page.find_by_slug(params[:slug])

答案 1 :(得分:1)

看一下https://github.com/norman/friendly_id gem,它可以简化使用slug的路由。

答案 2 :(得分:1)

你也可以这样做:

resources :pages, only: :show, param: :slug

将生成

  

页面GET /pages/:slug/(.:format)页面#show

我命令能够使用这样的帮助:page_path(page),其中page是Page的实例,您还需要覆盖to_param方法,如下所示:

def to_param
  slug
end