私は単純なモデルを持っています:
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)
使用している3つの方法は、次のことを行います。
update_attributes
はvalidateレコードを試行し、callbacksおよびsavesを呼び出します。update_attribute
はレコードを検証せず、callbacksおよびsavesを呼び出します。update_column
は、レコードを検証せず、コールバックを呼び出しませんデータベースを更新しますレコードですが、does n't call saveメソッドです。「機能する」唯一の方法がupdate_column
である場合、エラーがスローされているコールバックがどこかにあると思います。 log/development.log
ファイルをチェックして、何が起こっているかを確認してください。
update_attributes!
を使用することもできます。このバリアントはエラーをスローするため、モデルが保存されていない理由に関する情報を提供する場合があります。
update_attributes
を使用し、何をしているのか正確に知らない限り、他の2つの方法は避けてください。後でモデルに検証とコールバックを追加する場合、update_attribute
およびupdate_column
を使用すると、デバッグが非常に難しい厄介な動作が発生する可能性があります。
詳細は this link で確認できます。
私はこれと同じ問題を抱えていましたが、Railsを使用しています。この問題は、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)
直感的には、大量割り当ての問題があり、このようにモデルに属性を追加する必要があると言うでしょう
attr_accessible: :your_attribute, :your_attribute2