我创建了这个模块:
应用程序/模型/关切/ 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!!)
答案 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