我正在使用以下内容:
gem 'friendly_id', github: 'FriendlyId/friendly_id', branch: 'master'
我正在我的Rails 4网站上创建文章部分。我遇到的问题是,当我更改现有文章的名称时,slug不会更新。
这是我到目前为止所做的:
extend FriendlyId
friendly_id :name, use: :slugged
add_column :articles, :slug, :string
add_index :articles, :slug, unique: true
答案 0 :(得分:51)
在FriendlyId 4(兼容Rails 3)中有一个方法
should_generate_new_friendly_id?
您可以在模型上定义它以控制何时重新生成slug。 试试
def should_generate_new_friendly_id?
name_changed?
end
在名称更改时重新生成slug。
修改
FriendlyId版本5(Rails 4兼容)不再重新保存slug。要恢复此功能,您可以在保存或使用上面提供的解决方案之前将slug列设置为nil
。
编辑2
你需要覆盖用于保存的slug setter才能使用Rails< 5& FriendlyId>在此issue中引用了5。
将其添加到模型文件
def slug=(value)
if value.present?
write_attribute(:slug, value)
end
end
答案 1 :(得分:2)
我有这个问题,只是想指出我已经注意到了什么。
如果您只在文档中执行
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)
时,我不会做任何事情我假设你的标题没有变化。 (第一种方法处理俄语)
因此,当使用第一个模型时,所有工作都很好,但是当我将准备好的代码复制到下一个模型时,我想要进行重击,我遇到了一些问题。希望它可以帮助某人。
答案 2 :(得分:0)
我遇到了类似的问题,即使我的模型中有以下内容,slug 也不想在更新时更改:
def should_generate_new_friendly_id?
slug.blank? || title_changed?
end
就我而言,我不是直接通过表单设置标题,而是在 before_save
回调中设置标题,这就是原因,因为似乎 FriendlyID 不仅需要在保存之前进行更改,甚至还需要在 { {1}} 所以我将代码更改为:
before_validation
而且,这对我有用!
我真的花了太多时间试图弄清楚为什么它不起作用,所以我在这里发布这个案例,供任何可能陷入相同情况的人使用(并希望为您节省大量的调试时间)
>