【问题标题】:Rails 4: Active Record Validation error on: createRails 4:活动记录验证错误:创建
【发布时间】:2014-09-24 16:07:14
【问题描述】:

如果我在创建之前有一些操作,例如:

before_create :generate_token
private
def generate_token
  self.auth_token = loop do
    random_token = SecureRandom.urlsafe_base64(nil, false)
    break random_token unless self.class.exists?(auth_token: random_token)
  end
end

在编写验证时,我发现 validates :auth_token, presence: true, on: :create 失败。 但是,validates :auth_token, presence: true, on: :after_create 有效。

这是为什么?

参考。 Active Record Callback OrderActive Record Validations :on

编辑:奇怪的是,on: :before_create 通过验证,on: :create 失败,on: after_create 成功。这很令人费解,请解释一下吗?

【问题讨论】:

    标签: validation activerecord ruby-on-rails-4


    【解决方案1】:

    阅读您链接的文档,以:

    (1) before_validation
    
    (-) validate  <======== This runs before before_create callbacks are run
    
    (2) after_validation
    
    (3) before_save
    
    (4) before_create
    

    我会考虑在对象初始化时生成令牌。

    after_initialized :generate_token
    

    【讨论】:

    • 我链接了两个文档,你指的是哪个?后者解释了“:on 选项如何让您指定何时进行验证”。感谢您的建议,不幸的是,您的回答令人困惑且无益。你指出了我在我的 OP 中没有提到的 before_create 状态。
    • 假设我做了,并推断您的尖箭头响应转换为“验证失败,因为 'validate' 发生在 Active Record 对象的生命周期中比 'before_create' 更早”,那么你的结论是仍然无效:
    • 您上面的逻辑意味着“验证 [也] 在创建和 after_create 回调运行之前运行”(after_create 发生在创建之后,并且都发生在生命周期中的验证之后)。因此,如果 before_create 失败,那么 after_create 应该失败,如果(不知何故)after_create 确实通过了,那么 create 也应该通过。
    • 但是,正如在:after_create passes 验证上观察到的那样,on:create 没有。你怎么解释这个?你还没有回答这个问题。除非您的回答是“阅读您链接到的文档”。
    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多