2009-10-14 112 views
1

我有一个嵌套的对象是一种用户(比如说Sub)。我在保存Sub时假定用户验证也会运行,但显然不是?创建Sub时如何在用户中运行所有验证?嵌套的对象和validates_presence_of

回答

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 
+0

糟糕。我的意思是我有Sub Newy 2009-10-15 21:06:58

+0

这两个类对应于相同的sql表还是不同的表?你能发布一个简短的例子/测试用例吗? – rwilliams 2009-10-15 21:55:21