ActiveRecord忽略来自关注点的before_create挂钩

时间:2015-11-02 13:11:12

标签: ruby-on-rails activerecord

我有订阅新闻主题的模型,女巫有订阅/取消订阅的秘密字段:

class TopicSubscription < ActiveRecord::Base
  include WithSecret
  ...
end

这里是模块代码,它生成订阅密钥

module WithSecret
  extend ActiveSupport::Concern
  included do
    attr_accessible :secret
    validates_presence_of :secret    
    before_create :gen_secret
  end

  def gen_secret
    begin
      o =  [('a'..'z'),('0'..'9')].map{|i| i.to_a}.flatten
      code  =  (0...128).map{ o[rand(o.length)] }.join
    end while self.class.send(:"find_by",{secret: code})
    self.send("secret=",code)
  end
end

问题,如果gen_secret挂钩永远不会触发,我总是得到验证错误。这种奇怪行为的目的是什么?

1 个答案:

答案 0 :(得分:1)

验证后

before_create触发。请改用before_validation :gen_secret, on: :create