【问题标题】:Rails 5.0.1 - Friendly_id gem - included active concern module before_create or before_saveRails 5.0.1 - Friendly_id gem - 包含主动关注模块 before_create 或 before_save
【发布时间】: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


【解决方案1】:

This 帮我解决了这个问题。如果 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 2017-12-01
    • 2012-04-12
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多