2009-10-14 9 views
1

J'ai un objet imbriqué qui est un type d'utilisateur (disons Sub). J'avais supposé lors de la sauvegarde de Sub que les validations de l'utilisateur seraient également exécutées, mais apparemment pas? Comment exécuter toutes les validations dans l'utilisateur lors de la création de Sub?Objets imbriqués et validates_presence_of

Répondre

0

Les validations s'exécutent à partir du modèle hérité.

Voici un test qui montre que cela fonctionne.

test cas migration:

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 

Modèles de test:

class User < ActiveRecord::Base 
    validates_presence_of :name 
end 

class Sub < User 
    validates_presence_of :email 
end 

Tests Cas:

Création d'un sous sans un nom ou par courriel, à l'exception échouait avec le nom, le courriel peut Ne pas être en blanc

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

Création d'un sous sans courrier électronique, enregistrer doit échouer avec le courrier électronique ne peut pas être vide.

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

Créer un sous sans nom, enregistrer doit échouer avec le nom ne peut pas être vide.

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

La création d'un sous-répertoire avec le nom et l'adresse e-mail, enregistrer doit réussir.

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

Oups. Je voulais dire que j'ai Sub Newy

+0

Est-ce que les deux classes correspondent à la même table SQL ou à des tables différentes? Pouvez-vous poster un bref exemple/test? – rwilliams

Questions connexes