2011-07-18 4 views
4

J'ai un modèle simple appelé Discussion qui a une colonne booléenne appelée resolved.Rails: update_attributes ne met pas à jour tous les attributs

Dans ma forme, je le code suivant

<%= form_for(@discussion) do |d| %> 
... 
<%= d.check_box :resolved %> 
<% end %> 

Et dans mon contrôleur, je les suivantes:

def update 
    @discussion = Discussion.find(params[:id]) 
    if @discussion.update_attributes(params[:discussion]) 
    etc... 
    end 
end 

Quand je soumets la forme, je peux voir que les paramètres sont étant envoyé au serveur ...

Parameters: {"utf8"=>"✓", "authenticity_token"=>"AsGsRHwiVva/+kTrBs0IjLeZwj1ZmXBuKZr9Pg/N6Xk=", "discussion"=>{"shortdesc"=>"Talk about something.", "content"=>"Try to update check box.", "resolved"=>"1"}, "commit"=>"Update Discussion", "id"=>"1"} 

Mais la requête ne comprend rien à propos de la mise à jour de cette fi eld.

AREL (14.9ms) UPDATE "discussions" SET "content" = 'Try to update check box.', "updated_at" = '2011-07-18 17:53:50.783176' WHERE "discussions"."id" = 1 

Une idée de ce qui me manque?

Répondre

18

Il y a 4 raisons pour lesquelles cela pourrait se produire:

  1. resolved est déjà mis à true dans la base de données.
  2. Vous avez défini la méthode resolved= dans votre modèle et elle ne définit plus l'attribut.
  3. Vous avez attr_protected :resolved. Vous avez attr_accessible mais vous n'avez pas :resolved dans la liste.
+2

mon argent est sur le numéro 4 – stephenmurdoch

+1

Il était en fait le numéro 4. Bon oeil. Merci pour l'aide. –

+0

Une autre possibilité est que le modèle 'Discussion' a des validations ou des rappels qui interfèrent avec la mise à jour. – Dty

1

Votre colonne booléenne a-t-elle une valeur par défaut? Si la valeur par défaut est true, les rails ne se chargeront pas de l'ajouter à l'ensemble des attributs.

Alternativement, avez-vous attr_protected ensemble pour cette colonne? Si tel est le cas, les rails n'ajouteront jamais ce champ aux attributs en utilisant update_attributes. Vous devrez le faire manuellement.

+1

hmmmm j'ai oublié de définir la condition « OU » dans le modèle tout en spécifiant les valeurs par défaut. Dieu merci, j'ai trouvé votre message au début: P – ImranNaqvi

0

Etes-vous sûr que l'élément est envoyé? Je veux dire, élément de formulaire sans vérifier l'élément ne sont pas envoyés, donc vous devez mettre une case à cocher cachée par défaut false.

+0

Rails résout ce problème en ayant un champ caché avant la case à cocher avec le même nom avec la valeur false. Quoi qu'il en soit, ce n'est pas le cas car vous pouvez voir que la valeur 'resolved' est dans le hash des paramètres. – Samuel

+0

ok, undestand .. – eveevans

1

Tous,

j'avais récemment commencé rails et a été prise en charge du code de quelqu'un d'autre et a trouvé un autre scénario qui n'a pas été couvert ici qui me reçoit. Lorsque vous utilisez le style pointé par ce lien, les paramètres sont formés dans une méthode distincte. J'ai dû mettre à jour la méthode "_params" pour l'ajouter à la liste permise.

http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html