Pourquoi mes rails sont-ils annulés lorsque j’essaie d’utiliser user.save?

J’ai installé l’application exemple RailsTutorial (l’application de type Twitter) et j’essaie de comprendre pourquoi le code de la console suivant ne met pas à jour la firebase database lorsque j’essaie de mettre à jour la firebase database utilisateur. Je m’attends à ce que les informations utilisateur soient mises à jour une fois que j’utilise le user.save . Cependant, cela revient à des données non éditées. Est-ce dû à une ressortingction basée sur l’utilisateur?

Contrôleur d’utilisateurs:

 class UsersController  'User was successfully updated.') } format.json { respond_with_bip(@user) } else format.html { render :action => "edit" } format.json { respond_with_bip(@user) } end end end private def correct_user @user = User.find(params[:id]) redirect_to(root_path) unless current_user?(@user) end def admin_user redirect_to(root_path) unless current_user.admin? end end 

Console Rails:

 1.9.3-p392 :001 > user = User.find(109) User Load (8.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 109]] => # 1.9.3-p392 :002 > user.name = "larry" => "larry" 1.9.3-p392 :003 > user.save (0.2ms) begin transaction User Exists (0.6ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 109) LIMIT 1 (0.1ms) rollback transaction => false 

Modèle d’utilisateur:

 class User < ActiveRecord::Base # Declaration of public variables attr_accessible :email, :name, :password, :password_confirmation has_secure_password has_many :microposts, dependent: :destroy has_many :relationships, foreign_key: "follower_id", dependent: :destroy has_many :followed_users, through: :relationships, source: :followed has_many :reverse_relationships, foreign_key: "followed_id", class_name: "Relationship", dependent: :destroy has_many :followers, through: :reverse_relationships, source: :follower before_save {email.downcase!} before_save :create_remember_token validates :name, presence: true, length: {maximum: 50} VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-.]+\.[az]+\z/i validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false} validates :password, presence: true, length: {minimum: 6} validates :password_confirmation, presence: true after_validation {self.errors.messages.delete(:password_digest)} private def create_remember_token self.remember_token = SecureRandom.urlsafe_base64 end end 

Votre modèle d’utilisateur a probablement des validations qui ne sont pas satisfaites. Comme vous n’avez pas posté ceux-ci, je ne peux pas vraiment résoudre votre question. Pour vous faciliter la vie, vous pouvez déboguer pourquoi votre utilisateur n’est pas prêt à enregistrer.

Essayer de courir

 user.errors.full_messages 

ce qui devrait vous donner une idée de ce qui ne va pas.

Je sais que c’est un ancien message, mais j’espère que cela pourrait aider quelqu’un à suivre ce tutoriel à l’avenir.

Comme l’exprime la réponse acceptée, cela est dû aux validations qui ne sont pas satisfaites. J’ai également rencontré ce problème et constaté qu’une autre solution consiste à utiliser la méthode update_atsortingbute sur l’object user . Par exemple, si vous souhaitez mettre à jour le champ de name d’un object user et l’enregistrer automatiquement dans la firebase database, sans devoir toucher aux champs virtual password et password_confirmation , utilisez ce qui suit:

 user.update_atsortingbute(:name, "larry") 

Cela mettra à jour le champ de name uniquement et l’enregistrera dans la firebase database (pas besoin d’appeler la méthode save ), sans avoir à toucher les champs password et password_confirmation .

Après avoir essayé d’enregistrer ou de valider une instance de modèle d’enregistrement active, vous pouvez afficher plus d’informations sur ce qui s’est passé avec quelques commandes utiles.

 user = User.find(108) user.name = "Larry" user.valid? # returns false user.errors.messages # returns something like {email: "Cant be blank"} 

Évidemment, j’ai fait cette erreur parce que je ne sais pas à quoi ressemble votre fichier de modèle, mais si cela se répète, c’est pour l’une des deux raisons habituelles. La première est que vos validations ont échoué. Si leurs messages d’erreur ne sont pas, c’est probablement parce que quelque chose dans votre chaîne de filtrage a été renvoyé faux. Par exemple

 class User << ActiveRecord::Base before_save :accidentally_return_false def accidentally_return_false self.some_boolean = (condition == value) end end user = User.new( params ) user.save # where condition does not equal value user.valid? # false because of the before save method 

J'espère que cela pourra aider

Lorsque vous sauvegardez les retours en arrière, utilisez save! à la place, et le journal des erreurs sera imprimé.

Vos validations ne passent pas. Tu peux faire:

 user.errors.full_messages 

dans la console après la sauvegarde échouée pour voir pourquoi.

J’ai eu le même problème et aucune erreur n’était stockée. Il s’est avéré que ma fonction before_save false, ce qui entraînait l’annulation de la sauvegarde (je suppose que je suis nouveau sur les rails).

J’essayais de définir la valeur d’un booléen qui ne pouvait être défini qu’une fois le fichier téléchargé.

Voici ce que je faisais:

 before_save :set_orientation def set_orientation # ...do stuff... self[:is_landscape] = ratio > 1 # stores AND returns the boolean value!! end 

La dernière ligne de la fonction était aussi un retour implicite que je ne voulais pas faire. Ma solution était de rendre le retour explicitement:

 before_save :set_orientation def set_orientation # ...do stuff... self[:is_landscape] = ratio > 1 # store the boolean value return # now return end 

J’ai eu le même problème de la firebase database annulant mes transactions dans la console pendant que j’essayais de mettre à jour la propriété admin sur un utilisateur. Si vous faites le tutoriel sur les rails Hartl, le problème est que si vous tapez user.errors.messages dans la console, cela vous indiquera que le mot de passe est trop court. C’est parce que dans le modèle, il y a une validation de mot de passe avant d’enregistrer et de hacher votre mot de passe dans le password_digest.

Le travail autour de cela est dans la console effectuer votre activité normale comme la définition de user.admin = true, puis lorsque vous avez terminé, entrez user.password = “foobar”, puis entrez user.password_confirmation = “foobar”, puis quand vous effectuez user.save il va commettre toutes vos modifications.

Essayez de mettre à jour la firebase database:

 rails db:migrate