2010-04-27 3 views
1

J'ai un modèle de phrase et de correction avec une relation has_one et belongs_to respectivement.Rails - Pourquoi ma validation personnalisée est-elle déclenchée uniquement pour une commande de construction?

Pour une raison quelconque quand je fais

def create 

     @sentence = Sentence.find(params[:sentence_id]) 
     @correction = @sentence.build_correction(params[:correction]) 

une validation personnalisée que j'ai écrit pour la correction est appelée au point de build_correction. la validation est inférieure

class Correction < ActiveRecord::Base 
    attr_accessible :text, :sentence_id, :user_id 
    belongs_to :sentence 
    belongs_to :user 

    validate :correction_is_different_than_sentence 

    def correction_is_different_than_sentence 
    errors.add(:text, "can't be the same as the original sentence.") if (text == self.sentence.text) 
    end 

le problème est pour une raison quelconque sur la validation de l'objet de correction n'a pas l'ensemble identifiant la phrase (malgré je la méthode build_correction) et il se plaint « vous avez objet nul .. .. lors de l'exécution de nil.text "dans la clause if de la validation ci-dessus. Donc, ma question est pourquoi la validation se produit pour une commande de construction, je pensais que cela se déclenche seulement sur une création ou une mise à jour. Et pourquoi le phrase_id n'est-il pas défini?

+0

Je pense que cela fonctionnera si vous commentez "attr_accessible: text,: phrase_id,: user_id" – Salil

+0

merci pour la réponse. Malheureusement, cela n'a rien changé – robodisco

Répondre

-3

Comme jamais ce n'était pas faute de rails mais le mien - c'est trivial, long à expliquer, pas d'utilisation à quelqu'un d'autre, donc ne m'expliquera pas.

0

Une erreur créait beaucoup de maux de tête pour moi. Je ne sais pas pourquoi mais le déplacement de l'appel du validateur personnalisé à la fin des autres appels du validateur a résolu cela pour moi.

Avant

validates :name, :short_description, presence: true 
    validate :uniq_name 
    validates :price, :numericality => {:greater_than_or_equal_to => 0} 
    validates_attachment_content_type :image, :content_type => /image/ 

Après

validates :name, :short_description, presence: true 
    validates :price, :numericality => {:greater_than_or_equal_to => 0} 
    validates_attachment_content_type :image, :content_type => /image/ 
    validate :uniq_name 

voici mon validateur personnalisé

private 

def uniq_name 
    return if clone? 
    user_product = self.user.products.unlocked.where(:name => self.name).first 
    errors[:name] << "has already been taken" if user_product && !user_product.id.eql?(self.id) 
end 

Essayez ceci, peut-être, il fera l'affaire pour vous aussi.

Questions connexes