2010-11-21 90 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