web-dev-qa-db-fra.com

Rails 3 - vérifie que l'objet est valide avec les paramètres avant la mise à jour

J'ai une question très novice. Comment puis-je vérifier que l'objet du modèle est valide avec les nouveaux paramètres AVANT de le mettre à jour?

Je veux transformer ça:

def update
  @obj = SomeModel.find( params[:id] )

  if @obj.update_attributes( params[:obj] )
    # That have been updated
  else
    # Ups, errors!
  end
end

Pour quelque chose comme ça:

def update
  @obj = SomeModel.find( params[:id] )

  if @obj.valid_with_new_params( params[:obj] )
    @obj.update_attributes( params[:obj] )
  else
    # Ups, errors!
  end
end
19
ExiRe

Pour mettre à jour les attributs sans les enregistrer, vous pouvez utiliser

@obj.assign_attributes( params[:obj] )

Ensuite, pour vérifier si l'objet est valide, vous pouvez appeler

@obj.valid?

Si l'objet est pas valide, vous pouvez voir les erreurs (uniquement après avoir appelé .valid?) en appelant

@obj.errors

Si l'objet est valide, vous pouvez l'enregistrer en appelant

@obj.save

Cependant, tout cela habituellement n'est pas nécessaire. Si l'objet n'est pas valide, ActiveRecord n'enregistrera pas l'objet dans la base de données. Par conséquent, toutes les modifications d'attributs sont oubliées lorsque vous quittez l'action du contrôleur.

De plus, puisqu'un enregistrement non valide ne sera pas sauvegardé dans la base de données, vous pouvez toujours simplement appeler Object.find () à nouveau pour récupérer l'objet d'origine.

36
Justin

Vous pouvez appeler la méthode valid? pour exécuter les validations. 

Cela ne garantit pas la sauvegarde ultérieure si certaines de vos validations dépendent de l'état d'autres objets de la base de données. La sauvegarde peut également échouer pour des raisons non liées aux validations (par exemple, une contrainte de clé étrangère)

Je ne sais pas pourquoi vous voudriez ce motif

3
Frederick Cheung

Pour mettre à jour les attributs sans les sauvegarder

@obj.attributes = params[:obj]   0r
@obj.attributes = {:name => “Rob”}

Pour ensuite vérifier si l'objet est valide

@obj.valid?

Pour vérifier s'il y a une erreur

@obj.errors
0
Beena Shetty

L'objet ne sera pas sauvegardé si l'argument passé ne produit pas d'objet valide, vous pouvez donc utiliser votre chemin comme il convient. Vous pouvez voir les erreurs (le cas échéant) à l'aide du tableau @obj.errors.

0
Femaref

update_attributes method valide l'objet et renvoie false si l'objet n'est pas valide. Donc, vous pouvez simplement écrire:

if @obj.update_attributes( params[:obj] )
  # That have been update
else
  # Ups, errors!
end
0
Flexoid

La réponse est que vous pouvez définir une méthode

def valid_with_new_params(hash)
   self.attributes = hash
   valid?
end

Mais cela serait inutile car @obj.update_attributes(params[:obj]) renvoie true si l'obj a été correctement mis à jour et false sinon. Notez également qu'en interne, la méthode update_attributes exécute toutes les validations sur le @obj afin que vous ayez @obj.errors disponible si la mise à jour a échoué.

0
Gerry