【问题标题】:Ruby on Rails: Use slug instead of id on resource routesRuby on Rails:在资源路由上使用 slug 而不是 id
【发布时间】:2015-09-12 15:06:07
【问题描述】:

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

/admin/articles/:slug/edit

相对于

/admin/articles/:id/edit

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

只是想知道这是否可能。如果是这样,怎么做?

【问题讨论】:

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


【解决方案1】:

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

你只需要传递正确的值

article_path(id: @article.slug)

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

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

如果你愿意,你也可以覆盖Article模型的to_param来返回slug,这样你就可以使用

article_path(@article)

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

【讨论】:

    【解决方案2】:
    # config/routes.rb
    resources :articles, param: :slug
    

    在终端中:

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

    【讨论】:

    • 你确定参数选项在 Rails 3 中吗?
    • 应该是,但至少它在 Rails 4+ 中可用。
    • 这是“一步到位”的解决方案吗?即,例如,一旦您添加param: :slug,您的link_to article.name, article 就会生成一个指向slug 的链接,并且该slug 会被识别吗?答案是否定的,或者我做错了什么:)
    • @JonathanTuzman 如果路径看起来正确(例如/articles/my-great-article),您必须让控制器处理 slug 参数,例如@article = Article.find_by!(slug: params[:slug])
    • @JonathanTuzman 您需要向模型添加另一个方法以确保更改的参数与link_to article 一起使用:def to_param slug end 将确保使用 slug 而不是 id。更多内容可以在这里阅读:guides.rubyonrails.org/…
    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 2013-02-16
    • 2014-10-23
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多