Ruby on Rails:在资源路由上使用 slug 而不是 id

Ruby on Rails: Use slug instead of id on resource routes

所以我正在寻找一种解决方案,可以帮助我使用 Rails 资源实现以下目标:

/admin/articles/:slug/edit

相对于

/admin/articles/:id/edit

我正在寻找 Rails resource routes 而不是其他类型的路线。

只是想知道这是否可能。如果是这样,如何?

# config/routes.rb
resources :articles, param: :slug

在终端中:

$ rake routes
...
article GET    /articles/:slug(.:format)      articles#show
...

路由中的 :id 参数只是一个占位符,可以是任何东西,从数字标识符到 slug。

你只需要传递正确的值

article_path(id: @article.slug)

并使用适当的方法获取文章

Article.find_by!(slug: params[:id])

如果您愿意,您还可以将 Article 模型的 to_param 覆盖为 return slug,这样您就可以使用

article_path(@article)

然后自动将 slug 分配给 :id 参数。