在我的路线文件中,我可以很容易地将一个看起来像这样的匹配放在一起并且工作得很好
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传递给控制器?
答案 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