Rails 4 Friendly Id Slug Not Updating



我正在使用以下内容:

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

而且,这对我很管用!

我真的花了太多时间试图弄清楚为什么它不起作用,所以我在这里发布这个案例,给那些可能陷入同样情况的人(希望能节省你长时间的调试)

最新更新