2010-08-26 7 views
4

Je suit morceau de codequ'est-ce que `update_attribute` renvoie s'il échoue?

@user = User.find(params[:id]) 
if (@user.activation_status == "active") 
    #some code here 
    @user.update_attribute('activation_status' ,'inactive') # Line 44 
    #send mail to user that his account is Acivated 
else 

end 

Est-il possible que Line 44 s'échouer en raison d'une raison quelconque (par ex: - Base de données memmory est plein). que va-t-il se passer dans ce cas? si cela crée un problème, quelle est la meilleure façon de l'éviter? ce update_attribute retourner si elle a échoué?

Répondre

1

Si update_attributes échoue, il retournera false. Si vous ignorez la valeur de retour, vous ne le saurez pas non plus. Vous pouvez utiliser update_attributes !, qui à son tour appelle save !, qui à son tour déclenche une exception si quelque chose ne va pas. Bien que ce soit quelque chose que vous ne pouvez pas manquer (à moins que vous n'écriviez des instructions de récupération catch-all), si vous ne l'attrapez pas, il passera à Rails, et il annulera la requête.

Il est généralement recommandé de vérifier la valeur de retour.

+0

- Je sais ce que 'update_attributes' est-ce que je voudrais savoir sur' update_attribute'? – Salil

+0

Ils font tous les deux la même chose. Les attributs update_attributes et update_attribute utilisent les attributs attr =, puis appellent save. – AboutRuby

+1

- Vous avez tort de ne pas faire la même chose 'update_attributes' vérifier la validation avant d'enregistrer les données et retourner false si l'objet est invalide et vrai s'il est enregistré alors que' update_attribute' sauvegarde les données sans vérification des validations. – Salil

4

Voici la source update_attribute:

def update_attribute(name, value) 
    send(name.to_s + '=', value) 
    save(false) 
end 

Vous pouvez voir qu'il met à jour l'attribut demandé et appelle save avec perform_validations ensemble à false. Par conséquent update_attribute retournera false si l'un des rappels de sauvegarde (par exemple before_save) a empêché l'enregistrement d'être enregistré en renvoyant false.

S'il y avait une erreur de niveau inférieur, telle qu'une insuffisance de mémoire dans la base de données, je suppose que le pilote de base de données l'afficherait comme une exception qui serait transmise à votre code.

+0

qu'est-ce que 'update_attribute' va retourner je sais ce que fait' update_attributes'? 'update_attribute' &&' update_attributes' sont deux méthodes différentes. Je voudrais savoir à propos de 'update_attribute' – Salil

+0

Cette réponse fait référence à ** update_attribute **, j'avais fait une faute de frappe dans la version originale de la réponse. 'update_attribute' renvoie la valeur retournée par' save', comme décrit dans la réponse. – mikej