0

我目前在 rails 中使用 friendly_id gem,并注意到如果有人将帖子命名为“About”,它会覆盖我在 routes.rb 文件中分配给静态页面的 /about 路径。

这是我当前的代码:

  extend FriendlyId
  friendly_id :title, use: :history

如果以前有同名的帖子...它会添加--2。但是friendly_id 似乎忽略了我的routes.rb 中的静态路由。

有没有办法让friendly_id 识别而不覆盖这些路由?

谢谢

4

1 回答 1

4

FriendlyID 包括一个 Reserved 模块,它可以防止提供的单词列表被用作友好的 slug。您可以将静态路由添加到保留字数组中,以防止有人覆盖您的路由。

来自 FriendlyId RDocs

FriendlyId.defaults do |config|
  config.use :reserved
  # Reserve words for English and Spanish URLs
  config.reserved_words = %w(new edit nueva nuevo editar)
end

如果您仍然希望保留一个标题,您可以创建一个 FriendlyId 用于 slug 的新方法。RDocs 的这篇文章解释说


列还是方法?

FriendlyId 始终使用方法作为 slug 文本的基础 - 而不是列。乍一看,这可能听起来令人困惑,但请记住,Active Record 为模型关联表中的每一列提供方法,这就是 FriendlyId 使用的。

下面是一个使用自定义方法生成 slug 的类的示例:

class Person < ActiveRecord::Base
  friendly_id :name_and_location
  def name_and_location
    "#{name} from #{location}"
  end
end

bob = Person.create! :name => "Bob Smith", :location => "New York City"
bob.friendly_id #=> "bob-smith-from-new-york-city"

您可以创建一个类似:title_with_idor的方法:title_with_rand。这取决于您以及您希望蛞蝓的外观。

您还需要确保在routes.rb具有友好 ID 的路由之前列出您的静态路由。第一个路由调度程序匹配的是请求将被处理的地方。

于 2013-05-01T19:15:26.970 回答