4

在我的路线文件中,我可以轻松地将一个看起来像这样并且工作正常的匹配放在一起

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

这适用的视图中的链接是

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

我宁愿不在 URL 中包含 ID 号,所以我希望做类似的事情

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

但问题是这不会向页面显示控制器提供 id。是否有某种方法可以使用 :slug 将其与数据库中的页面进行匹配以找到 :id 以便我可以将 :id 传递给控制器​​?

4

3 回答 3

6

在您的路线中使用这个

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

并在你的控制器中使用这个通过 slug 找到页面

@page = Page.find_by_slug(params[:slug])
于 2012-12-17T11:07:02.690 回答
1

看看https://github.com/norman/friendly_id gem,它大大简化了 slug 的路由。

于 2012-07-06T04:13:25.833 回答
1

你也可以这样做:

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

这将产生

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

我为了能够像这样使用这个助手:page_path(page),其中 page 是 的一个实例Page,您还需要to_param像这样覆盖该方法:

def to_param
  slug
end
于 2016-07-29T12:58:03.673 回答