Bri*_*ian 21 ruby-on-rails friendly-id
我正在使用以下内容:
gem 'friendly_id', github: 'FriendlyId/friendly_id', branch: 'master'
Run Code Online (Sandbox Code Playgroud)
我正在我的Rails 4网站上创建一篇文章部分.我遇到的问题是,当我更改现有文章的名称时,slug不会更新.
这是我到目前为止:
extend FriendlyId
friendly_id :name, use: :slugged
add_column :articles, :slug, :string
add_index :articles, :slug, unique: true
Run Code Online (Sandbox Code Playgroud)
Mik*_*del 52
在FriendlyId 4(兼容Rails 3)中有一种方法
should_generate_new_friendly_id?
Run Code Online (Sandbox Code Playgroud)
并且您可以在模型上定义它以控制slug何时重新生成.尝试
def should_generate_new_friendly_id?
name_changed?
end
Run Code Online (Sandbox Code Playgroud)
名称更改时重新生成slug.
编辑
FriendlyId版本5(Rails 4兼容)不再保存slug.要恢复此功能,您可以nil
在保存之前将slug列设置为或使用上面提供的解决方案.
编辑2
您需要覆盖您的保存的slug setter,以便在本期中引用的Rails <5&FriendlyId> 5中工作.
将其添加到模型文件中
def slug=(value)
if value.present?
write_attribute(:slug, value)
end
end
Run Code Online (Sandbox Code Playgroud)
我有这个问题,只是想指出我所注意到的。
如果你只像在文档中那样做
class Post < ActiveRecord::Base
extend FriendlyId
friendly_id :title, use: :slugged
end
Run Code Online (Sandbox Code Playgroud)
然后运行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
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,当你运行时它不会做任何事情,Post.find_each(&:save)
因为你的标题没有改变。(第一种方法处理俄语)
因此,当使用第一个模型时,一切都很好,但是当我将准备好的代码复制到下一个模型时,我想进行 slugify,我遇到了一些问题。希望它可以帮助某人。