【问题标题】:Rails 4: before_save callback not workingRails 4:before_save 回调不起作用
【发布时间】:2015-01-22 15:55:29
【问题描述】:

我有一个多态 lookups 表和一个子 ContractType 模型。我在设置categoryContractType 模型中有一个before_save 回调,但它似乎不起作用。

class Lookup < ActiveRecord::Base
  validates :value, presence: true
  validates :category, presence: true
end

class ContractType < Lookup
  before_save { self.category = "contract_type" }
end

然后我打开rails c

> c = ContractType.create(value: "test")
> c.errors.messages
=> { :category => ["can't be blank"] }

我没有收到任何错误,只是验证失败。据我所知,语法看起来是正确的,只是before_save 回调似乎不起作用......

我在这里遗漏了什么明显的东西吗?

【问题讨论】:

    标签: ruby-on-rails-4 activerecord callback polymorphism


    【解决方案1】:

    我发现了问题...验证发生在save 之前,所以它总是“失败”验证并在before_save 回调发生之前停止。

    解决方案是使用before_validation 回调。

    class ContractType < Lookup
      before_validation { self.category = "contract_type" }
    end
    

    我对事件顺序的误解。

    【讨论】:

      【解决方案2】:

      我知道您找到了解决方案,但请从逻辑上考虑您的问题和解决方案。您正在对类别值进行硬编码。这意味着用户不能将其留空。它将永远被填满。那么为什么首先要对其进行验证呢?删除这个:

      validates :category, presence: true
      

      在 before_save 回调中,您将知道该值将被分配。 before_validation 确实有用例。例如,用户输入货币属性的值,并且您希望在验证之前格式化货币。但在您的情况下,不需要 before_validation。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 2015-11-14
        • 2018-11-28
        • 1970-01-01
        相关资源
        最近更新 更多