2013-01-19 26 views
18

我有一个简单的模型:的Rails:update_column作品,但不是update_attributes方法

class Reply < ActiveRecord::Base 
    attr_accessible :body 
    belongs_to :post 
end 

在我的控制,我有一个简单的更新方法:

def update 
    @reply = Reply.find(params[:id]) 
    if @reply.update_attributes!(params[:reply]) 
    render :js => "alert('I am trying to update!')" 
    else 
    render :js => "alert('<%= @reply.errors %>')" 
    end 
end 

这不会引发错误,但它也没有实际更新答复。相反,我得到了“我正在更新!”消息,就像一切工作。但是,当我重新加载页面并查看回复时,它具有相同的文本。它并未实际更新。如果我替换update_attributes:

@reply.update_column(:body, params[:reply][:body]) 

它工作正常。如果我使用:

@reply.update_attribute(:body, params[:reply][:body]) 

它再一次不起作用。任何想法发生了什么?

在我的记录,我有这样的:

Started PUT "/posts/2/replies/20" for 127.0.0.1 at 2013-01-19 10:39:57 -0600 
Processing by RepliesController#update as JS 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Xot7E+ldXiBm0hVvw5XUP/U5guJU2g8e4QaLbDVGzDE=", "reply"=>{"body"=>"Updated text."}, "commit"=>"Submit Revision", "post_id"=>"2", "id"=>"20" 
[1m[35mUser Load (1.0ms)[0m SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
[1m[36mReply Load (0.0ms)[0m [1mSELECT `replies`.* FROM `replies` WHERE `replies`.`id` = 20 LIMIT 1[0m 
[1m[35m (1.0ms)[0m BEGIN 
[1m[36mPost Load (0.0ms)[0m [1mSELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 2 LIMIT 1[0m 
[1m[35m (0.0ms)[0m COMMIT 
Rendered replies/_reply_content.html.erb (502.0ms) 
Rendered replies/update.js.erb (505.0ms) 
Completed 200 OK in 849ms (Views: 484.0ms | ActiveRecord: 94.0ms) 
+0

您使用的是哪种版本的导轨? – Wasi

+0

我使用3.2.11版本中的最新版本3.2.11。 – nullnullnull

+0

你可以使用'update_attributes!'来查看它为什么没有保存。 – alestanis

回答

61

您使用做不同的事情的三种方法:

  • update_attributes尝试验证记录,来电回调保存;
  • update_attribute不验证记录,呼叫回调保存;
  • update_column不验证记录,不调用回调,不调用保存方法,尽管它确实更新了记录在数据库中。

如果“工作”的唯一方法是update_column我的猜测是你有一个回调的地方是抛出一个错误。尝试检查您的log/development.log文件,看看发生了什么。您可以使用update_attributes!。这个变体会抛出一个错误,所以它可能会告诉你为什么你的模型没有保存。

您应该使用update_attributes并避免其他两种方法,除非您确切知道自己在做什么。如果稍后将验证和回调添加到模型中,则使用update_attributeupdate_column可能导致难以调试的令人讨厌的行为。

您可以检查this link以了解更多信息。

+1

感谢您的信息。奇怪的是,即使是爆炸的update_attributes!不会抛出错误。我在日志文件中也找不到任何错误,虽然也许我没有正确读取它。我已经将日志添加到了我的帖子中,如果你不介意给它看看。 – nullnullnull

+0

我更新了更多信息的问题。具体来说,我已经将一个条件放入控制器中,以便在出现任何错误时抛出错误。相反,它的行为就像是正确保存。有些东西在这里很奇怪,对吧? – nullnullnull

+0

@timothythehuman你的状况在爆炸版本中是无用的。无论如何,如果它无法保存,它会引发一个错误,所以你永远不会进入'@ reply.errors'行。如果您想打印任何错误,您应该使用正常版本。是的,东西*非常奇怪... – alestanis

0

隐隐猜测是说你有一个质量分配问题,应该在你的模型像这样

attr_accessible: :your_attribute, :your_attribute2 
+0

这也是我的第一个猜测。不幸的是,我已经做到了(我改变的唯一属性)attr_accessible。不管怎么说,还是要谢谢你! – nullnullnull

0

我有同样的问题,添加属性,但使用Rails 4.问题发生时你在update_attribute中有params []。在Rails 4强参数

@reply.update_attributes(params[reply_params]) 

应该

@reply.update_attributes(reply_params) 

我不熟悉Rails 3中,但是这应该是这个问题:

@reply.update_attributes(params[:reply]) 

应该

@reply.update_attributes(:reply) 
相关问题