【问题标题】:friendly_id and routes.rb - railsfriendly_id 和 routes.rb - rails
【发布时间】:2013-05-01 18:57:08
【问题描述】:

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

这是我当前的代码:

  extend FriendlyId
  friendly_id :title, use: :history

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

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

谢谢

【问题讨论】:

  • 我添加了一个答案,但是查看routes.rb 文件的相关行会很有帮助。

标签: ruby-on-rails ruby-on-rails-3 friendly-id


【解决方案1】:

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_id:title_with_rand 的方法。这取决于您以及您希望蛞蝓的外观。

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

【讨论】:

  • 这行得通...但不是像 about--2 那样创建一个新的friendly_id,它只是返回一个错误,说“Friendly_id 已保留”。然后,您必须手动重命名帖子。有没有办法让它以同样的方式继续 :history 吗?
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
相关资源
最近更新 更多