0

我创建了这个模块:

应用程序/模型/关注/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

我将它包含在模型中,如下所示:

应用程序/模型/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 的原因!)

4

1 回答 1

1

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

所以我的模块需要在这之前“跳入”。所以制作一个与 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
于 2017-02-18T21:00:10.487 回答