Rails 5.0.1 - Friendly_id gem - 包含主动关注模块 before_create 或 before_save

Rails 5.0.1 - Friendly_id gem - included active concern module before_create or before_save

我创建了这个模块:

app/models/concerns/sluggable.rb

module Sluggable
  extend ActiveSupport::Concern

  included do
    before_create :set_slug
  end


  def set_slug
    if self.slug.nil?
      puts 'adding slug'
      self.slug = SecureRandom.urlsafe_base64(5)
    end
  end

end

然后我将其包含在模型中,如下所示:

app/models/plan.rb

class Plan < ApplicationRecord
  extend FriendlyId
  friendly_id :id, :use => :slugged
  include Sluggable
end

但是 before_create 没有触发。 slug 列是 not_null 列,所以我收到数据库错误。

错误:"slug" 列中的空值违反了非空约束

如果将 set_slug 代码直接放在模型中,它就可以工作。那么,关于 Rails 5 中的问题,我在这里遗漏了什么?

我想知道它是否与使用 FriendlyId 有关(这就是我首先添加 slug 的原因!)

This 帮我解决了这个问题。 Friendly_Id 如果 slug 为 nil,则在 before_validation 回调中设置 slug。

所以我的模块需要先 'jump'。所以制作一个与Friendly_id不冲突的模块的解决方法如下

请注意,我需要更改挂钩的方法名称(因为 set_slug 是 Friendly_Id 使用的方法)并且我必须使用 prepend: true。这一起导致我的代码在 Friendly_Id 触发检查以尝试设置它之前设置 slug。

module Sluggable
  extend ActiveSupport::Concern

  included do
    before_validation :set_a_slug, prepend: true
  end


  def set_a_slug
    if self.slug.nil?
      self.slug = SecureRandom.urlsafe_base64(5)
    end
  end

end