2010-11-21 3 views
1

Je suis un débutant pour le développement des rails. J'ai une méthode personnalisée placée dans ma classe Post, dans laquelle je veux mettre à jour un attribut particulier/variable de cette classe Post. Ma méthode va comme ci-dessous: -Rails: Impossible de sauvegarder l'objet après l'avoir mis à jour!

def update_bid_winner (winner_id) 
    @bid_winner_id = winner_id 
    puts @bid_winner_id 
    save 
    puts "post saved" 
end 

Mais quand j'afficher l'objet Post, la variable bid_winner_id est toujours pas mis à jour.
Je doute que l'enregistrement de l'objet ne réussisse pas après la mise à jour, car
les puts placés la méthode ci-dessus imprime la valeur correcte avec laquelle je suis en train de mettre à jour.

Journaux de ma fenêtre rails du serveur: -

2  <<< Output of the puts placed for debugging 
post saved 


Started GET "/posts/1/bids/1/offer_bid" for 127.0.0.1 at Sun Nov 21 13:21:59 +0530 2010 
Processing by BidsController#offer_bid as HTML 
Parameters: {"post_id"=>"1", "id"=>"1"} 
User Load (3.1ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1 
Post Load (3.1ms) SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1) LIMIT 1 
Bid Load (0.5ms) SELECT "bids".* FROM "bids" WHERE ("bids"."id" = 1) LIMIT 1 
Redirected to http://localhost:3000/posts/1 
Completed 302 Found in 167ms 

Mon schéma post comme suit: -

create_table "posts", :force => true do |t| 
t.integer "user_id" 
t.string "title" 
t.text  "body" 
t.integer "bid_winner_id" 
end 

Qu'est-ce que je fais mal ici ???

Répondre

1

Vous n'avez pas besoin d'une méthode personnalisée pour cela. Rails a une méthode pratique appelée update_attribute:

@post.update_attribute(:bid_winner_id,winner_id) 

qui fonctionnera, mais même cela ne Rails idiomatiques. Si un message est associé au modèle BidWinner, et en admettant que vous trouvé (ou créé) un BidWinner et assigné à @bid_winner), vous dites simplement:

@post.bid_winner = @bid_winner 
@post.save 

Une autre chose - vous n'êtes pas vraiment mise à jour via un GET, êtes-vous? Ce ne serait généralement pas une bonne chose.

+0

, Merci pour les entrées Man, je voudrais vraiment essayer les moyens mentionnés. Je suis vraiment novice en matière de rails et j'essaie juste de faire des choses pour le moment. Je prévois d'utiliser un poste, je vais changer le faire pour poster. La poste est bien non? Je veux dire qu'il n'aura pas de trous de boucle de sécurité non? – Hemanth

3

Utilisez la méthode accesseur à la place de la variable d'instance @bid_winner_id.

def update_bid_winner (winner_id) 
    self.bid_winner_id = winner_id 
    puts self.bid_winner_id 
    save 
    puts "post saved" 
end 
+0

Cool Man, ça a marché. Mais j'ai besoin d'une clarification. Je suis très nouveau à ruby, selon ma compréhension "self" est utilisé dans le contexte pour les méthodes de classe et les variables correctes. Est-ce que 'self' est équivalent à 'this' en Java et dans d'autres langues similaires? Pouvez-vous s'il vous plaît informer sur l'utilisation de soi? :) – Hemanth

+1

Rails effectue une vérification incorrecte (http://api.rubyonrails.org/classes/ActiveModel/Dirty.html) et seuls les objets sales sont enregistrés. Il ne détecte les objets sales que si vous appelez des méthodes. –

Questions connexes