ここの誰かが私を正しい方向に向けることができることを願っています。
「update_attributes」を実行しているコントローラーUpdatedefがあります。現在、エラーメッセージなしでfalseを返します。私はRubyにかなり慣れていませんが、コーディングには慣れていません。これにより、数日間困惑しました。以下に指定された値でユーザーモデルとデータベースを更新しようとしています。
def update
#get currently logged in user
@user = current_user
#update user params based on edit form...
if @user.update_attributes(params[:user])
redirect_to profile_path, :notice => "Successfully updated profile."
else
render :action => 'edit'
end
end
私の編集定義...
def edit
@user = current_user
end
フォームは、この更新メソッドに以下を送信します。
--- !Ruby/hash:ActiveSupport::HashWithIndifferentAccess
utf8: ✓
_method: put
authenticity_token: 9T4ihVI0p8j7pZEFxof3Bfahi2a+o3BPmtXJDnfHT4o=
user: !Ruby/hash:ActiveSupport::HashWithIndifferentAccess
first_name: Amanda
last_name: Ross
is_owner: '1'
email: [email protected]
commit: Update
action: update
controller: users
id: '20'
そして、params [:user]は以下を返します。
{"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"}
これらのフィールドはすべてモデルのattr_accessibleにあり、問題なくユーザーを作成できます。
ここにdevelopment.logの出力があります(申し訳ありませんが、少し面倒です)。
Started PUT "/users/20" for 127.0.0.1 at 2012-04-17 10:39:29 +0100
Processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"9T4ihVI0p8j7pZEFxof3Bfahi2a+o3BPmtXJDnfHT4o=", "user"=> {"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"}, "commit"=>"Update", "id"=>"20"}
[1m[36mUser Load (1.0ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = 20 LIMIT 1[0m
>>>>>>>>>>>>
{"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"}
[1m[35m (0.0ms)[0m begin transaction
[1m[36mUser Exists (0.0ms)[0m [1mSELECT 1 FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 20) LIMIT 1[0m
[1m[35mUser Exists (0.0ms)[0m SELECT 1 FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 20) LIMIT 1
[1m[36m (0.0ms)[0m [1mrollback transaction[0m
Rendered users/_form.html.erb (7.0ms)
Rendered users/edit.html.erb within layouts/application (10.0ms)
Rendered layouts/_includes.html.erb (30.0ms)
誰かが私がどこで間違っているのか指摘するのを手伝ってくれるでしょうか?
前もって感謝します!
#update_attributes
と#save
はどちらも、データベースへの書き込みを続行する前に、モデルインスタンスが#valid?
であるかどうかを最初に確認します。モデルインスタンスが#valid?
でない場合、これらのメソッドはfalseを返します。モデルインスタンスの何が問題になっているのかを確認するには、モデルの#errors
を確認してください。
Rails.logger.info(@user.errors.messages.inspect)
または、メソッドに埋め込まれ、
def update
@user = current_user
if @user.update_attributes(params[:user])
redirect_to profile_path, :notice => "Successfully updated profile."
else
# print the errors to the development log
Rails.logger.info(@user.errors.messages.inspect)
render :action => 'edit'
end
end
代わりにupdate_attributes!
を呼び出すことで、属性を更新する際のイントロスペクションを改善することもできます。これにより、falseを返すだけでなく、例外が発生します。