嵌套对象和validates_presence_of

时间:2009-10-14 21:25:08

标签: ruby-on-rails

我有一个嵌套对象,是一种User(比如Sub)。我在保存Sub时假设用户验证也会运行,但显然不是?在创建Sub?

时,如何在User中运行所有验证?

1 个答案:

答案 0 :(得分:0)

验证确实从继承的模型开始。

这是一个测试用例,显示它有效。

测试用例迁移:

class CreateUser < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :name,:string
      t.column :email, :string
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

测试模型:

class User < ActiveRecord::Base
  validates_presence_of :name
end

class Sub < User
  validates_presence_of :email
end

测试案例:

创建没有名称或电子邮件的子,保存失败的名称,电子邮件不能为空

>> b = Sub.create()
=> #<Sub id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
>> b.save
=> false
>> b.errors
=> #<ActiveRecord::Errors:0x2457458 @errors={"name"=>["can't be blank"], "email"=>["can't be blank"]}, @base=#<Sub id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>>

创建没有电子邮件的子,保存失败,电子邮件不能为空。

>> b = Sub.create(:name=>'test')
=> #<Sub id: nil, name: "test", email: nil, created_at: nil, updated_at: nil>
>> b.save
=> false
>> b.errors
=> #<ActiveRecord::Errors:0x243865c @errors={"email"=>["can't be blank"]}, @base=#<Sub id: nil, name: "test", email: nil, created_at: nil, updated_at: nil>>

创建没有名称的子,保存失败,名称不能为空。

>> b = Sub.create(:email=>'test')
=> #<Sub id: nil, name: nil, email: "test", created_at: nil, updated_at: nil>
>> b.save
=> false
>> b.errors
=> #<ActiveRecord::Errors:0x2429594 @errors={"name"=>["can't be blank"]}, @base=#<Sub id: nil, name: nil, email: "test", created_at: nil, updated_at: nil>>

创建一个包含姓名和电子邮件的子,保存应该会成功。

>> b = Sub.create(:email=>'test',:name=>'test')
=> #<Sub id: 4, name: "test", email: "test", created_at: "2009-10-15 22:27:53", updated_at: "2009-10-15 22:27:53">
>> b.save
=> true