Rails 4 Friendly Id Slug不更新

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)

  • @HarshaMV` [attribute] _changed?`是Rails为您生成的方法. (7认同)

And*_*nga 6

我有这个问题,只是想指出我所注意到的。

如果你只像在文档中那样做

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,我遇到了一些问题。希望它可以帮助某人。

  • 已经 2 年了,但我会尽力回答:)。我相信关键是有时您希望在是否更新标题方面进行自定义行为。假设您 1. 添加了 `should_generate_new_friendly_id?` 2. 一段时间过去了,现在您想再次重新生成 slug。`Post.find_each(&amp;:save)` - 正如文档中所建议的那样是行不通的。我想这是重点。 (2认同)