friendly_id和routes.rb - rails

时间:2013-05-01 18:57:09

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

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

这是我目前的代码:

  extend FriendlyId
  friendly_id :title, use: :history

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

有没有办法让friendly_id识别并且不会覆盖这些路线?

谢谢

1 个答案:

答案 0 :(得分:4)

FriendlyID包含一个保留模块,可以防止提供的单词列表被用作友好的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始终使用方法作为段塞文本的基础 - 而不是列。乍一看,这可能听起来令人困惑,但请记住,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的路线之前列出您的静态路线。第一个路由调度程序匹配是处理请求的位置。