25

私は単純なモデルを持っています:

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)
4

3 に答える 3

83

使用している3つの方法は、異なることを行います。

  • update_attributesレコードの検証を試み、コールバックを呼び出して保存します;
  • update_attributeレコードを検証せず、コールバックを呼び出して保存します;
  • update_columnデータベース内のレコードを更新しますが、レコードを検証せず、コールバックを呼び出さず、 saveメソッドを呼び出しません。

「機能する」唯一の方法がupdate_column私の推測である場合、エラーをスローしているコールバックがどこかにあるということです。ファイルをチェックして、log/development.log何が起こっているかを確認してください。

を使用することもできますupdate_attributes!。このバリアントはエラーをスローするため、モデルが保存されない理由に関する情報が得られる場合があります。

update_attributes自分が何をしているのかを正確に理解していない限り、他の2つの方法を使用して回避する必要があります。後でモデルに検証とコールバックを追加する場合、を使用するupdate_attributeupdate_column、デバッグが非常に難しい厄介な動作が発生する可能性があります。

詳細については、このリンクを確認してください。

于 2013-01-19T16:42:06.943 に答える
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)
于 2014-04-30T03:34:08.423 に答える
0

直感的には、大量割り当ての問題があり、このようにモデルに属性を追加する必要があると言うでしょう。

attr_accessible: :your_attribute, :your_attribute2
于 2013-01-24T15:50:47.850 に答える