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

时间:2017-02-18 19:32:08

标签: ruby-on-rails activerecord friendly-id activesupport-concern

我创建了这个模块:

应用程序/模型/关切/ 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列,因此我收到了数据库错误。

错误:列中的空值&#34; slug&#34;违反非空约束

如果将set_slug代码直接放在模型中,它就可以工作。那么我在这里想到的关于Rails 5中的关注点是什么?

我想知道它是否与使用FriendlyId有关(这就是为什么我首先添加了slu!!)

1 个答案:

答案 0 :(得分:1)

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

所以我的模块需要“跳跃”。在此之前。因此,制作与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