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)