web-dev-qa-db-fra.com

Rails: update_column travaux, mais pas update_attributes

J'ai un modèle simple:

class Reply < ActiveRecord::Base
  attr_accessible :body
  belongs_to :post
end

Dans mon contrôleur, j'ai une méthode de mise à jour simple:

def update
  @reply = Reply.find(params[:id])
  if @reply.update_attributes!(params[:reply])
    render :js => "alert('I am trying to update!')"
  else
    render :js => "alert('<%= @reply.errors %>')"
  end
end

Cela ne jette pas une erreur, mais cela ne met pas non plus à jour la réponse. Au lieu de cela, je reçois le "J'essaie de mettre à jour!" message, comme tout a fonctionné. Mais quand je recharge la page et regarder la réponse, il a le même texte. Il n'a pas été mis à jour. Si je remplace update_attributes avec:

@reply.update_column(:body, params[:reply][:body])

Ça fonctionne bien. Si j'utilise:

@reply.update_attribute(:body, params[:reply][:body])

Il ne fonctionne à nouveau pas. Une idée de ce qui se passe?

Dans mon journal, j'ai ceci:

Started PUT "/posts/2/replies/20" for 127.0.0.1 at 2013-01-19 10:39:57 -0600
Processing by RepliesController#update as JS
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Xot7E+ldXiBm0hVvw5XUP/U5guJU2g8e4QaLbDVGzDE=", "reply"=>{"body"=>"Updated text."}, "commit"=>"Submit Revision", "post_id"=>"2", "id"=>"20"
[1m[35mUser Load (1.0ms)[0m  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
[1m[36mReply Load (0.0ms)[0m  [1mSELECT `replies`.* FROM `replies` WHERE `replies`.`id` = 20 LIMIT 1[0m
[1m[35m (1.0ms)[0m  BEGIN
[1m[36mPost Load (0.0ms)[0m  [1mSELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 2 LIMIT 1[0m
[1m[35m (0.0ms)[0m  COMMIT
Rendered replies/_reply_content.html.erb (502.0ms)
Rendered replies/update.js.erb (505.0ms)
Completed 200 OK in 849ms (Views: 484.0ms | ActiveRecord: 94.0ms)
23
nullnullnull

Les trois méthodes que vous utilisez font différentes choses:

  • update_attributes tente de valider l'enregistrement, les appels rappels et enregistre ;
  • update_attribute ne valide pas les rappels, appels et enregistre ;
  • update_column ne valide pas l'enregistrement, ne appelle pas les rappels, n'appelle pas la méthode de sauvegarde , bien qu'elle Est-ce que Mettre à jour enregistre dans la base de données.

Si la seule méthode qui "fonctionne" est update_column Mon hypothèse est que vous avez un rappel quelque part qui lance une erreur. Essayez de vérifier votre log/development.log Fichier pour voir ce qui se passe.

Vous pouvez aussi utiliser update_attributes!. Cette variante lancera une erreur. Il peut donc vous donner des informations sur la raison pour laquelle votre modèle ne sauve pas.

Tu devrais utiliser update_attributes et éviter les deux autres méthodes à moins que vous sachiez exactement ce que vous faites. Si vous ajoutez des validations et des rappels ultérieurement à votre modèle, en utilisant update_attribute et update_column peut conduire à des comportements méchants qui sont vraiment difficiles à déboguer.

Vous pouvez vérifier ce lien pour plus d'informations à ce sujet.

76
alestanis

Un gut devine serait de dire que vous avez un problème d'affectation de masse et devriez ajouter vos attributs dans votre modèle comme celui-ci

attr_accessible: :your_attribute, :your_attribute2
0
Pasta