我可以在 Rails 模型上使用 Friendly Id 而不必在模型 table 上创建 slug 列吗?

Can I use Friendly Id on a Rails model without having to create a slug column on the model table?

关于Rails 4.2,我想使用Friendly Id for routing to a specific model, but dont wan't to create a slug column on the model table. I would instead prefer to use an accessor method on the model and dynamically generate the slug. Is this possible? I couldn't find this in the documentation

您不能直接使用友好 ID 执行此操作,因为它使用 slug 查询数据库的方式 (relevant source)。

不过要实现你想要的并不难。您需要的是两种方法:

  1. Model#slug 方法会为您提供特定型号的 slug
  2. Model.find_by_slug 方法,该方法将为特定的 slug 生成相关查询。

现在在您的控制器中,您可以使用 Model.find_by_slug 从路径参数中获取相关模型。然而,实施此方法可能会很棘手,特别是如果您的 Model#slug 使用 non-reversible 像 Slugify 这样的 slugging 实施,因为它只是摆脱文本中无法识别的字符并将多个内容标准化为同一字符(例如。 _ 和 - 至 -)

您可以使用 URI::Escape.encodeURI::Escape.decode,但您最终会得到一些难看的 slug。

正如所讨论的 我采用了以下基于动态 slug 的自定义路由方法。

我想要这样的自定义路由:/foos/the-title-parameterized-1(其中“1”是 Foo 对象的 id)。

Foo 型号:

#...
attr_accessor :slug
#dynamically generate a slug, the Rails `parameterize` 
#handles transforming of ugly url characters such as 
#unicode or spaces:
def slug
  "#{self.title.parameterize[0..200]}-#{self.id}"
end
def to_param
  slug
end 
#...

routes.rb:

get 'foos/:slug' => 'foos#show', :as => 'foo'

foos_controller.rb:

def show
  @foo = Foo.find params[:slug].split("-").last.to_i
end 

在我的 show 视图中,我可以使用默认的 url 辅助方法 foo_path