如果某些验证是作用域的,为什么我的before_validation方法不会被触发?

时间:2011-02-14 01:51:55

标签: ruby-on-rails validation callback

在我的模型中,我有两种方法可以在验证之前填充Invoice的属性:

validates :account_id, :presence => true
validates :account_address, :presence => true
validates :number, :presence => true
validates :number, :uniqueness => true, :scope => :client_id

before_validation :generate_number, :associate_addresses, :on => :create

def generate_number
  self.number = self.client.invoices.count + 1
end

def associate_addresses
  self.account_address = self.account.addresses.first
end

在控制器中:

@invoice = @account.invoices.build(:client_id => @client.id)

if @invoice.save
  #it saved
end

我的问题是associate_addressesgenerate_number方法只有在我删除:scope => :client_id验证的:number参数时才会触发。

为什么它会因此而跳过before_validation回调?

使用Rails 3.0.3

谢谢! 感谢。

1 个答案:

答案 0 :(得分:2)

不知道为什么它会跳过before_validation方法,但是要在Rails 3中确定uniqueness验证的范围,你应该使用以下语法:

validates :number, :presence => true, :uniqueness => { :scope => :client_id }

我想您的语法是尝试添加scope验证,但不存在。可能有一个Rails错误使得跳过before_validation方法。