Rails 4 Friendly Id Slug不更新

时间:2013-07-20 16:44:02

标签: ruby-on-rails friendly-id

我正在使用以下内容:

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

3 个答案:

答案 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

而且,这对我有用!

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

>