在URL中的Rails slug – 使用Active Record Model Post的Title属性而不是ID

我一直在试图让我的Rails创buildurl来显示logging,通过使用他们的标题,而不是他们在URL中的ID,如:

/职位/ A-后约-火箭

在线教程后,我做了以下几点:


由于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 

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

我们还必须更新查找使用slug列而不是使用ID查找logging。

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

在这一点上,似乎工作,除了显示一个logging,因为find_by_slug! 还不存在。

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

find_by_foo不是你需要定义的东西。 只要您有一个名为“foo”的列,ActiveRecord就会为您提供帮助。 如果没有findlogging,像你一样添加一个感叹号将会引发exception,而不是在没有使用感叹号的情况下返回nil。

至于你的具体问题,你添加你的slu to邮政,但你想在项目上search。

这不一定是你的问题的直接答案,但你看过Stringex插件( http://github.com/rsl/stringex )? 这是自动为您的logging创buildslu </s>的好方法。

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

 class Post < ActiveRecord::Base acts_as_url :title end 

它会自动创build你的标题slu and并将其保存到slug列。

它创造slu way的方式也非常聪明。 例如,今天只有“10%off”的标题变成了“今天只有10%的折扣”。

很漂亮!

Stringex的gem本身很棒,但我不认为把它保存在数据库上是个好主意。 你需要记住的是,如果与slug相关的变化你需要更新你的slug列。 E一致。

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

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

我希望这个post有一些帮助。 我试图解释一切。