我正在使用以下内容:
gem 'friendly_id', github: 'FriendlyId/friendly_id', branch: 'master'
我正在我的Rails4网站上创建一个文章部分。我遇到的问题是,当我更改现有文章的名称时,slug不会更新。
这就是我目前所拥有的:
extend FriendlyId
friendly_id :name, use: :slugged
add_column :articles, :slug, :string
add_index :articles, :slug, unique: true
在FriendlyId 4(与Rails 3兼容)中,有一个方法
should_generate_new_friendly_id?
你可以在你的模型上定义它来控制鼻涕虫何时再生。尝试
def should_generate_new_friendly_id?
name_changed?
end
在名称更改时重新生成段塞。
编辑
FriendlyId版本5(与Rails4兼容)不再在保存时重新生成slug。要恢复此功能,您可以在保存前将段塞列设置为nil
,也可以使用上面提供的解决方案。
编辑2
您需要覆盖slug setter,以便保存Rails<5&FriendlyId>5,如本期所述。
将其添加到模型文件中
def slug=(value)
if value.present?
write_attribute(:slug, value)
end
end
我有这个问题,只想指出我注意到的地方。
如果你只做在文件
class Post < ActiveRecord::Base
extend FriendlyId
friendly_id :title, use: :slugged
end
然后运行Post.find_each(&:save)
-slug会得到更新。。。
然而,就我而言,我的模型中也有这些
class Post < ActiveRecord::Base
extend FriendlyId
friendly_id :title, use: :slugged
def normalize_friendly_id(text)
text.to_slug.normalize(transliterations: :russian).to_s
end
def should_generate_new_friendly_id?
title_changed?
end
end
使用上面的代码,我想当您运行Post.find_each(&:save)
时它不会有任何作用,因为您的标题不会更改。(第一种方法处理俄语)
所以,当使用第一个模型时,一切都很好,但当我把准备好的代码复制到下一个我想要的模型时,我遇到了一些问题。希望它能帮助到别人。
我遇到了一个类似的问题,即使我的模型中有以下内容,鼻涕虫也不想在更新时更改:
def should_generate_new_friendly_id?
slug.blank? || title_changed?
end
在我的情况下,我没有直接通过表单设置标题,而是在before_save
回调中设置标题,这就是原因,因为FriendlyID似乎不仅需要在保存之前进行更改,甚至需要在before_validation
中进行更改,所以我将代码更改为:
before_validation :set_title
def set_title
self.title = 'some dynamic way of getting title'
end
而且,这对我很管用!
我真的花了太多时间试图弄清楚为什么它不起作用,所以我在这里发布这个案例,给那些可能陷入同样情况的人(希望能节省你长时间的调试)