我目前正在使用rails中的friendly_id gem,并注意到如果有人将帖子命名为“About”,它会覆盖我在routes.rb文件中分配给静态页面的/ about路径。
这是我目前的代码:
extend FriendlyId
friendly_id :title, use: :history
如果之前有相同名称的帖子,则会添加--2。但friendly_id似乎忽略了我的routes.rb中的静态路由。
有没有办法让friendly_id识别并且不会覆盖这些路线?
谢谢
答案 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的路线之前列出您的静态路线。第一个路由调度程序匹配是处理请求的位置。