2010-11-21 111 views
1

我是rails開發的新手。 我有一個自定義方法放置在我的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變量仍然沒有更新。
我懷疑對象的保存在更新後不成功,因爲
放置上述方法的打印輸出正在嘗試更新的正確值。從我的鐵軌服務器窗口

日誌: -

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) 

這將工作,但即使是不地道的軌道。如果帖子被關聯到BidWinner模型,並假設你發現(或創建)一個BidWinner並分配它@bid_winner),那麼你乾脆說:

@post.bid_winner = @bid_winner 
@post.save 

的另一件事 - 你是不是真的通過GET更新,是嗎?這通常不是一件好事。

+0

,感謝輸入曼,我真的想嘗試一下上面提到的方法。我真的很陌生,所以現在就按照我的方式嘗試一下。我打算使用郵政,我會改變發佈。郵政是好的嗎?我的意思是它不會有任何安全迴路漏洞? – Hemanth 2010-11-21 08:28:34

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

酷男,工作。但我需要澄清。我對ruby非常陌生,因爲根據我的理解,「自我」在上下文中用於類方法和變量是正確的。在Java和其他類似語言中,'self'等同於'this'方法嗎?你能簡單介紹一下自己的用法嗎? :) – Hemanth 2010-11-21 08:24:06

+1

Rails執行髒檢查(http://api.rubyonrails.org/classes/ActiveModel/Dirty.html),只保存髒對象。如果您調用方法,它只會檢測髒對象。 – 2010-11-21 08:28:01