J'ai ce qui suit dans mon modèle utilisateur dans l'un de mes contrôleurs, Je veux seulement mettre à jour et valider le champ Avatar sans mise à jour et validation de courrier électronique . Par exemple (cela ne fonctionnera pas) P>
Puis-je faire ceci? p> if @user.update_attributes(params[:user])
# do something...
end
5 Réponses :
Vous pouvez puis mettez à jour l'attribut Ainsi: p> update_attribute code>
, que Skip Validation a>. Si vous ajoutez Ceci à votre utilisateur code>
: def update_just_this_one(attr, value)
raise "Bad #{attr}" if(!User.valid_attribute?(attr, value))
self.update_attribute(attr, value)
end
Cela vérifierait également les validations de courrier électronique, tout simplement pas avatar.
@Madhusudhan: Vous pouvez configurer la validation à la main et utiliser update_attribute code>. S'il vous plaît voir ma mise à jour.
Ne devrait pas la ligne 4 dans la logique ci-dessus être "Retour! Mock.Errors.has_key? (attr)"?
@Felafelwaffle: Oui, il y avait un ! Code> là-bas. Merci pour l'information.
Avez-vous essayé de mettre une condition sur le http://ar.rubyonrails.org/classes/acterecord /Validations/classmethods.html#m000083 P>
Options de configuration: P>
Si - Spécifie une méthode, une procédure ou une chaîne à appeler pour déterminer si la validation devrait se produire (par exemple: if =>: allemande_validation ou: if => proc.new {User | user.signup_step> 2}). La méthode, le procédé ou la chaîne doivent renvoyer ou évaluer à une valeur vraie ou fausse. P>
Sauf si - Spécifie une méthode, une procréation ou une chaîne à appeler pour déterminer si la validation ne doit pas se produire (par exemple: Sauf =>: Skip_Validation ou: Sauf => Proc.New {User | utilisateur.signup_step <= 2} ). La méthode, le procédé ou la chaîne doivent renvoyer ou évaluer à une valeur vraie ou fausse. P>
blockQuote> validateate_presence_of: email code>? p>
Je suppose que vous en avez besoin, car vous avez un sorcier en plusieurs étapes, où vous téléchargez d'abord l'avatar et que le courrier électronique est rempli ultérieurement.
à ma connaissance, avec vos validations telles qu'elles sont, je Voir aucune bonne solution de travail. Vous validez tout ou que vous mettez à jour l'avatar sans validations. Si ce serait un attribut simple, vous pouvez vérifier si la nouvelle valeur réussit la validation séparément, puis mettez à jour le modèle sans validations (par exemple, en utilisant Je peux suggérer Deux approches alternatives possibles: p> Donc, je vais proposer quelque chose comme ceci: p> espère que cela aide. p> p> update_attribute code>). P>
errors.add (: email, "e-mail est requis") génère une erreur = "e-mail de messagerie est requis". Changer "Email est requis" à juste titre "est requis"
une condition?
validates_presence_of :email, :if => :email_changed?
Brillant. Merci, je ne me suis même pas réalisé que vous avez ces fonctions de maîtrise pratique!
Voici ma solution.
Il garde le même comportement que class MyModel < ActiveRecord::Base
def valid_attributes?(attributes)
mock = self.class.new(self.attributes)
mock.valid?
mock.errors.to_hash.select { |attribute| attributes.include? attribute }.each do |error_key, error_messages|
error_messages.each do |error_message|
self.errors.add(error_key, error_message)
end
end
self.errors.to_hash.empty?
end
end
> my_model.valid_attributes? [:first_name, :email] # => returns true if first_name and email is valid, returns false if at least one is not valid
> my_modal.errors.messages # => now contain errors of the previous validation
{'first_name' => ["can't be blank"]}
Dupliquer? Stackoverflow.com/Questtions/457239/...
Non, je pense que
mock.valid? code> valide tout. Je cherche à valider qu'un seul attribut.