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
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.
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
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
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
.
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
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é.