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
我创建了这个模块:
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