2011-11-08 3 views
1

J'ai récemment mis à jour mon application rails à partir des rails 2.3.3 à 2.3.8 et j'ai rencontré un tel problème: toutes les validations de modèles fonctionnent correctement dans navigateur, mais complètement ignoré lors du test en utilisant .valid? méthode de la console. Cela arrive à tous mes modèles. Par exemple, mon entreprise modèle a:La validation Rails 2.3.8 ne fonctionne pas à partir de la console (valide? Renvoie toujours vrai)

class Company < Content 
... 

# Validation 

    before_validation  :ensure_token_existance 

    validates_presence_of :name, 
         :address, 
         :employee_count, 
         :category_ids, 
         :region_ids, 
         :phone, 
         :email, 
         :if => Proc.new { |company| company.step?(1) }, 
         :message => "required field" 

    validates_presence_of :description, 
         :if => Proc.new { |company| company.step?(2) }, 
         :message => "required field" 

    after_update :cache_sweeper 

... 

test maintenant la validation de l'instance Société de la console:

$ script/console 
Loading development environment (Rails 2.3.8) 
>> c = Company.new 
=> #<Company id: nil, account_id: nil, name: nil, description: nil, employee_count: nil, logo_file_name: nil, logo_content_type: nil, logo_file_size: nil, logo_updated_at: nil, created_at: nil, updated_at: nil, moderation: nil, token: nil, expired_at: nil, address: nil, phone: nil, fax: nil, email: nil, site: nil, delta: true, position: nil, major_company: false, wizard_step: 0, manager_id: nil, org_form: "", robots: nil, language: nil> 
>> c.valid? 
=> true 
>> c.errors 
=> #<ActiveRecord::Errors:0x105004848 @errors=#<OrderedHash {}>, @base=#<Company id: nil, account_id: nil, name: nil, description: nil, employee_count: nil, logo_file_name: nil, logo_content_type: nil, logo_file_size: nil, logo_updated_at: nil, created_at: nil, updated_at: nil, moderation: "draft", token: "mYoXPgNYwxBmdCTI", expired_at: nil, address: nil, phone: nil, fax: nil, email: nil, site: nil, delta: true, position: nil, major_company: false, wizard_step: 0, manager_id: nil, org_form: "", robots: nil, language: nil>> 
>> c.save 
=> true 
>> c.save! 
=> true 

J'ai vérifié http://guides.rubyonrails.org/v2.3.8/activerecord_validations_callbacks.html#when-does-validation-happen:

Les méthodes suivantes déclenchement validations, et enregistrera l'objet à la base de données seulement si l'objet est valide:

create 
create! 
save 
save! 
update 
update_attributes 
update_attributes! 

Les versions bang (par ex. save!) déclenche une exception si l'enregistrement est invalide. Les versions non-bang ne le font pas: save et update_attributes retourne false, crée et met juste à jour l'objet/s.

Quelqu'un peut-il m'aider à trouver ce qui ne va pas ici? =)

+1

Est-ce que votre '' ': if => Proc.new {| compagnie | company.step? (1)} '' 'cause le problème? car je ne vous vois pas en train de configurer la company.step dans la console. Cela pourrait donc faire oublier la validation, car ce n'est pas le cas. – Koby

+0

Thx @Koby, qui a vraiment causé le problème, merci pour votre aide – Wastrox

Répondre

1

Vos validations dépendent de l'entreprise étant dans une certaine étape. Vous n'avez jamais défini cette propriété dans la console. Qu'est-ce qui se passe si vous essayez:

c = Company.new 
c.step = 1 
c.valid? 

Je devine juste que la méthode step? fait simplement un test d'égalité sur l'attribut step. Si ce n'est pas le cas, faites ce qu'il faut pour que votre modèle satisfasse step?(1).

+0

Merci beaucoup Derek, qui a vraiment résolu un problème. On dirait que j'ai passé trop de temps à mettre à jour mon application vers la version 2.3.8 pour le manquer ... – Wastrox

Questions connexes