26

我正在使用以下内容:

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
4

3 回答 3

61

在 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。要恢复此功能,您可以nil在保存之前将 slug 列设置为,也可以使用上面提供的解决方案。

编辑 2

您需要覆盖 slug setter 以使您的保存适用于 Rails <5 & FriendlyId> 5,如本期所述。

将此添加到模型文件

  def slug=(value)
    if value.present?
      write_attribute(:slug, value)
    end
  end
于 2013-07-20T18:20:53.083 回答
6

我有这个问题,只想指出我注意到了什么。

如果您只按照文档中的方式进行操作

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)因为你的标题没有改变。(第一种方法处理俄语)

因此,在使用第一个模型时一切都很好,但是当我将准备好的代码复制到下一个模型时,我想进行 slugify,我遇到了一些问题。希望它可以帮助某人。

于 2016-03-26T14:30:06.130 回答
0

我遇到了类似的问题,即使我的模型中有以下内容,slug 也不想在更新时更改:

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

而且,这对我有用!

我真的花了太多时间试图弄清楚它为什么不起作用,所以我在这里为任何可能陷入相同情况的人发布这个案例(并希望为您节省大量的调试时间)

于 2021-03-04T11:24:04.333 回答