Ruby on rails URL中的Rails段塞-使用活动记录模型Post';s Title属性而不是ID

Ruby on rails URL中的Rails段塞-使用活动记录模型Post';s Title属性而不是ID,ruby-on-rails,Ruby On Rails,我一直试图让我的Rails通过在URL中使用记录的标题而不是ID来创建URL来显示记录,例如: /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 = sel

我一直试图让我的Rails通过在URL中使用记录的标题而不是ID来创建URL来显示记录,例如:

/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
class Post
创建帖子时,URL友好版本的标题将存储在数据库的slug列中

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

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

在这一点上,除了显示一条记录外,它似乎是有效的,因为逐段查找!还不存在


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

find_by_foo不是你需要定义的东西。只要您有一个名为“foo”的列,ActiveRecord将为您接管它。如果找不到记录,则添加感叹号会导致引发异常,而如果不使用感叹号,则返回nil而不返回异常


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

这不一定是对您的问题的直接回答,但您是否查看了Stringex插件()?这是一个为你的唱片自动创建slug的好方法

您只需向模型中添加以下内容:

class Post < ActiveRecord::Base
  acts_as_url :title
end
class Post
它会根据你的标题自动创建slug并保存到slug列

它制造鼻涕虫的方式也很聪明。例如,标题“今天只打10%的折扣”会变成“今天只打10%的折扣”


真滑

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

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


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

我发现这个问题比答案更有用;)你提出了一个让你的slug保持更新的好观点。幸运的是,Stringex有一个选项,如果链接字段被更新,它将更新slug。:)更新slug对于搜索引擎上的索引页面来说可能是毁灭性的,因为url会发生变化,无法再找到。所以我认为,参考你的博客文章,slug必须是数据,而不是自动用引用字段更新。更好的做法是保留您的slug的某种历史记录,并重定向到最新的slug/url。我将gem添加到我的gem文件中,运行bundle安装,重新启动服务器…确保拼写正确。你的评论说是
act\u as\u url
,但应该是
act\u as\u url