Rails 3 - vérifier que l'objet est valide avec params avant la mise à jour
J'ai très newbie question. Comment puis-je vérifier que l'objet du modèle est valide avec de nouveaux paramètres AVANT de le mettre à jour?
Je veux les transformer en une:
def update
@obj = SomeModel.find( params[:id] )
if @obj.update_attributes( params[:obj] )
# That have been updated
else
# Ups, errors!
end
end
À 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
Vous devez vous connecter pour publier un commentaire.
De mettre à jour les attributs sans sauvegarde, vous pouvez utiliser
Puis de vérifier si l'objet est valide, vous pouvez appeler
Si l'objet est pas valide, vous pouvez voir les erreurs (seulement après l'appel de
.valid?
) en appelantSi l'objet est valide, vous pouvez l'enregistrer en appelant
Cependant, tout ce généralement n'est pas nécessaire. Si l'objet n'est pas valide, alors ActiveRecord de ne pas enregistrer l'objet dans la base de données, de sorte que tous les changements d'attribut sont oubliées lorsque vous quittez l'action du contrôleur.
Aussi, depuis une défaillance de dossier ne seront pas enregistrées dans la base de données, vous pouvez toujours l'Objet d'appel.find() pour obtenir l'objet d'origine à l'arrière.
attributes()
méthode comme indiqué dans cette réponse, au moment de cette écriture est obsolète. Au lieu d'utiliserassign_attributes(new_attributes)
ou l'aliasattributes=(new_attributes)
. Ainsi, la première ligne de cette réponse devrait être@obj.assign_attributes( params[:obj] )
. Voir ActiveRecord::AttributeAssignmentassign_attributes(new_attributes)
-- notez que la seule attributs sont ceux qui sont nommés par touches dans les paramètres de hachage. Donc, si vous avez un objet existant, vous pouvez ajouter/fusionner juste un sous-ensemble d'attributs.update(attributes)
playbook (qui est un alias commeupdate_attributes(attributes)
) -- Afficher la source pourupdate(attributes)
et vous verrezassign_attributes(attributes)
suivie parsave
(et il est ensave
que les validations se produire avant la persistance/enregistrement).@obj.assign_attributes( params[:obj] )
mon@obj
devenirnil
Vous pouvez appeler la
valid?
méthode à exécuter les validations.Cela ne garantit pas qu'un enregistrement ultérieur ne sera possible que si certains de vos validations dépendent de l'état des autres objets dans la base de données. Te sauver peut également échouer pour des raisons non liées à des validations (par exemple une contrainte de clé étrangère)
Je ne suis pas sûr pourquoi vous voulez ce modèle
L'objet ne sera pas sauvegardé si l'argument passé n'est pas de produire un objet valide, de sorte que vous pouvez utiliser votre façon de très bien. Vous pouvez voir les erreurs (le cas échéant) à l'aide de la
@obj.errors
tableau.update_attributes
méthode de valider l'objet et le renvoyer false si l'objet n'est pas valide. Ainsi, vous pouvez simplement écrire:La réponse est que vous pouvez définir une méthode
Mais ce serait inutile, car
@obj.update_attributes(params[:obj])
retournetrue
si le fichier a été correctement mis à jour etfalse
autrement. Notez également qu'à l'intérieur de l'update_attributes
méthode s'exécute toutes les validations sur le@obj
de sorte que vous avez@obj.errors
disponible si la mise à jour a échoué.attributes=
méthode est déconseillée dans les nouvelles versions de RailsDe mettre à jour les attributs sans les enregistrer
Pour ensuite vérifier si l'objet est valide
Pour vérifier si il y a une erreur