URL 中的 Rails slugs - 使用 Active Record 模型帖子的 Title 属性而不是 ID

Posted

技术标签:

【中文标题】URL 中的 Rails slugs - 使用 Active Record 模型帖子的 Title 属性而不是 ID【英文标题】:Rails slugs in URL - using Active Record Model Post's Title attribute instead of ID 【发布时间】:2010-11-18 03:49:48 【问题描述】:

我一直在尝试让我的 Rails 创建 URL 来显示记录,方法是使用它们的标题而不是 URL 中的 ID,例如:

/posts/a-post-about-rockets

按照在线教程,我做了以下操作:


由于 ID 不再在 URL 中,我们必须稍微更改代码。

class Post < ActiveRecord::Base
  before_create :create_slug

  def to_param
    slug
  end

  def create_slug
    self.slug = self.title.parameterize
  end
end

创建帖子时,标题的 URL 友好版本存储在数据库中的 slug 列中。

我们还必须更新结果以使用 slug 列而不是使用 ID 来查找记录。

class ProjectsController < ApplicationController
  def show
    @project = Project.find_by_slug!(params[:id])
  end
end

在这一点上,除了显示记录之外,它似乎可以工作,因为 find_by_slug!还不存在。

我是一个极端的新手 - 我应该在哪里定义它?

【问题讨论】:

我发现这个问题比答案更有用;) 【参考方案1】:

这不一定是您问题的直接答案,但您是否查看过 Stringex 插件 (http://github.com/rsl/stringex)?这是为您的记录自动创建 slug 的好方法。

您可以在模型中添加如下内容:

class Post < ActiveRecord::Base
  acts_as_url :title
end

它会根据你的标题自动创建 slug 并将其保存到 slug 列。

它创建蛞蝓的方式也非常聪明。例如,标题“10% off, today only”会变成“10-percent-off-today-only”。

相当漂亮!

【讨论】:

我收到 act_as_url 的方法未找到错误。我将 gem 添加到我的 Gemfile 中,运行 bundle install,重新启动服务器... 确保拼写正确。你的评论是act_as_url,但它应该是acts_as_url【参考方案2】:

find_by_foo 不是您需要定义的东西。只要您有一个名为“foo”的列,ActiveRecord 就会为您处理。像你一样添加感叹号会在没有找到记录时引发异常,而不是如果你不使用感叹号则返回 nil 而没有异常。

至于您的具体问题,您已将 slug 添加到 Post,但您正在尝试在 Project 上进行搜索。

【讨论】:

【参考方案3】:

Stringex gem 非常适合自己生成 slug,但我不同意将其保存在数据库中是个好主意。您需要记住,如果与 slug 相关的内容发生变化,您需要将 slug 列更新为。 E 一致。

最终,无论以何种形式,它都是重复的信息。正是因为这个原因,我才写了一篇文章。

http://blog.ereslibre.es/?p=343

希望这篇文章对你有所帮助。我试图解释那里的一切。

【讨论】:

您提出了一个关于保持更新的好观点。幸运的是,Stringex 有一个选项可以在更新链接字段时更新 slug。 :) 更新 slug 对搜索引擎上的索引页面来说可能是毁灭性的,因为 url 更改并且无法再找到。所以我认为,参考您的博客文章,slugs 必须是数据,而不是自动更新引用的字段。更好的办法是保留您的 slug 的某种历史记录,并重定向到最新的 slug/url。

以上是关于URL 中的 Rails slugs - 使用 Active Record 模型帖子的 Title 属性而不是 ID的主要内容,如果未能解决你的问题,请参考以下文章

了解 Rails 模型中的 slug_candidates 方法

清理 URL slug 的 Unicode 字符串(Ruby/Rails)

Rails 4中友好id gem的随机slug url

用于生成 slug 的 Java 代码/库(用于漂亮的 URL)

在没有在模型中定义的情况下在 rails 中创建 slug

Rails 中漂亮(过时)的 RESTful URL