2010-11-21 17 views
1

私はレール開発の初心者です。 Postクラスの特定の属性/変数を更新したいPostクラスにカスタムメソッドを配置しました。私の方法は次のようになります: -Rails:更新後にオブジェクトを保存できません!

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

しかし、Postオブジェクトを表示すると、bid_winner_id変数はまだ更新されません。

putsが上記のメソッドを配置すると、更新しようとしている正しい値が出力されるため、オブジェクトの保存が更新後に正常に行われないことは疑いありません。私のレール・サーバ・ウィンドウから

ログ: -

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 

マイポストスキーマ、次のように: -

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

私はここで間違って何をやっています?

答えて

1

これを行うためのカスタムメソッドは必要ありません。 Railsはupdate_attributeと呼ばれる便利な方法があります。

@post.update_attribute(:bid_winner_id,winner_id) 

動作しますが、でもそれは慣用Railsのではありません。ポストは)BidWinnerモデルに関連付けられている、とあなたがた(または作成)BidWinnerを仮定し、@bid_winnerするためにそれを割り当てられている場合は、単純に言う:

@post.bid_winner = @bid_winner 
@post.save 

もうひとつ - あなたは本当にありませんGET経由でこれを更新していますか?それは一般的には良いことではありません。

+0

、入力のありがとうMan、私は本当に記載された方法を試してみたいと思います。私はレールには本当に新しいので、今のところ私の方法で物事を試してみる。私はポストを使うつもりです、私は投稿をポストに変更します。投稿は大丈夫ですか?私はそれはセキュリティのループの穴を右に持っていないという意味ですか? – Hemanth

3

インスタンス変数@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

クールマン、それは働いた。しかし、私は明確化が必要です。私は自分の理解によれば、クラスメソッドと変数の文脈で "自己"が使用されているので、私は非常にルビーに新しいです。 '自己'はJavaや他の同様の言語で 'this'メソッドと同等ですか?あなたは自己の使い方について簡単にお聞かせください。 :) – Hemanth

+1

Railsはダーティチェック(http://api.rubyonrails.org/classes/ActiveModel/Dirty.html)を実行し、ダーティオブジェクトだけが保存されます。メソッドを呼び出すと、汚れたオブジェクトだけが検出されます。 –

関連する問題