【发布时间】:2017-02-18 19:32:08
【问题描述】:
我已经创建了这个模块:
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 的原因!)
【问题讨论】:
-
set_slug 不应该是类方法。只需在 sluggable 模块中将其编写为普通方法即可。
-
这是我首先尝试的。同样的问题 - 我已经更新了问题以将代码恢复到我最初拥有它的方式(即不是作为类方法)
-
将其更改为
before_save是否有效? -
您还提到,如果您将
set_slug添加到模型作品中。那么将included do...end留在模块中并仅复制 set_slug 有效吗? -
很高兴知道你解决了它! :)
标签: ruby-on-rails activerecord friendly-id activesupport-concern