accepts_nested_attributes和验证的边缘情况

时间:2012-10-06 18:06:25

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

我有一个Account模型,它接受用户模型的嵌套属性。帐户has_many users。因此,如果没有帐户,用户就无法存在。我写了这个验证:

# users.rb
validates :account_id, presence: true, numericality: { only_integer: true }

在注册过程中,用户会填写帐户表单和嵌套的用户表单。但是,由于该帐户尚不存在,我的测试失败并出现此错误:

#<ActiveModel::Errors: ... @base=#<Account id: nil, title: "ACME Corp", subdomain: "acme1", created_at: nil, updated_at: nil>, @messages={:"users.account_id"=>["can't be blank"]}>

除非通过Accounts#new中的嵌套表单创建用户,否则我始终希望确保为用户存在有效的帐户ID。换句话说,当同时创建Account时,在这种情况下,尚未存在要提供给用户的帐户ID。

有办法做到这一点吗?

这可能是一个没有实际意义的点,因为所有新用户都将通过current_account对象创建,即current_account.users.build。但我想确定。

2 个答案:

答案 0 :(得分:1)

在用户模型中:

validates :account, :presence => true

在帐户模型中:

has_many :users, :inverse_of => :account

这只是验证父对象是否存在 - 即使它尚未保存。

答案 1 :(得分:0)

我会考虑:

validates_presence_of :account_id, only => :create
validates_numericality_of_account_id:, :null => true # or :only => :create

两个案件的分离和特殊助手的使用有助于立即可读。