8
votes

Valider et mettre à jour des rails d'attributs simples

J'ai ce qui suit dans mon modèle utilisateur xxx pré>

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 .


Puis-je faire ceci? p>

Par exemple (cela ne fonctionnera pas) P>

if @user.update_attributes(params[:user])
 # do something... 
end


2 commentaires

Dupliquer? Stackoverflow.com/Questtions/457239/...


Non, je pense que mock.valid? valide tout. Je cherche à valider qu'un seul attribut.


5 Réponses :


13
votes

Vous pouvez Valider l'attribut à la main et utiliser update_attribute code> , que Skip Validation a>. Si vous ajoutez Ceci à votre utilisateur code> : xxx pré>

puis mettez à jour l'attribut Ainsi: p>

def update_just_this_one(attr, value)
    raise "Bad #{attr}" if(!User.valid_attribute?(attr, value))
    self.update_attribute(attr, value)
end


4 commentaires

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 . 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 ! là-bas. Merci pour l'information.



1
votes

Avez-vous essayé de mettre une condition sur le validateate_presence_of: email ?

http://ar.rubyonrails.org/classes/acterecord /Validations/classmethods.html#m000083

Options de configuration:

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.

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.


0 commentaires

1
votes

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 update_attribute ).

Je peux suggérer Deux approches alternatives possibles:

  • Soit vous assurez que l'e-mail est toujours entré en premier, ce qui, à mon avis, n'est pas une mauvaise solution. Et puis, avec chaque sauvegarde, la validation est remplie.
  • Sinon, changez la validation. Pourquoi voudriez-vous déclarer une validation sur un modèle, s'il existe des enregistrements dans la base de données qui ne répondent pas à la validation? C'est très intuitif.

    Donc, je vais proposer quelque chose comme ceci: xxx

    espère que cela aide.


1 commentaires

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"



8
votes

une condition?

validates_presence_of :email, :if => :email_changed?


1 commentaires

Brillant. Merci, je ne me suis même pas réalisé que vous avez ces fonctions de maîtrise pratique!



1
votes

Voici ma solution. Il garde le même comportement que .valid? Stritte> méthode, sorcière retourne vrai ou faux, et ajoutez des erreurs sur le modèle sur la sorcière qu'elle a été appelée.

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"]}


0 commentaires