Rails 4:before_save回调无法正常工作

时间:2015-01-22 15:55:30

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

我有一个带有子lookups模型的多态ContractType表。我在before_save模型中设置ContractType回调设置了category,但它似乎没有效果。

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回调似乎不起作用......

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:7)

我发现问题......验证发生在save之前,所以它始终&#34;失败&#34;验证并在before_save回调发生之前停止。

解决方案是使用before_validation回调。

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

我对事件顺序的误解。

答案 1 :(得分:0)

我知道您找到了解决方案,但是从逻辑上考虑问题和解决方案。您正在对类别值进行硬编码。这意味着用户不能将其留空。它将始终被填充。那么,为什么首先要对其进行验证?只需删除此内容即可:

validates :category, presence: true

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