ruby on rails - active - rails update_attributes devuelve falso al intentar actualizar los valores de db
ruby rails active record (2)
¡También puede obtener una mejor introspección al actualizar atributos llamando a update_attributes!
en cambio, lo que genera excepciones en lugar de simplemente devolver falso.
Esperando que alguien aquí pueda apuntarme en la dirección correcta.
Tengo una actualización de controlador que ejecuta "update_attributes". Actualmente devuelve falso, sin mensaje de error. Soy bastante nuevo con Ruby, pero no con la codificación, ¡y esto me ha dejado perplejo durante unos días! Estoy tratando de actualizar el modelo de usuario y la base de datos con los valores que se especifican a continuación.
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
mi edit def ...
def edit
@user = current_user
end
El formulario envía lo siguiente a este método de actualización:
--- !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''
Y params [: usuario] devuelve:
{"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"}
Todos estos campos están en attr_accessible en el modelo, y puedo crear un usuario sin ningún problema.
Aquí está la salida de development.log (lo siento, es un poco desordenado) ...
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)
¿Podría alguien ayudarme a señalar dónde me voy mal, por favor?
¡Gracias por adelantado!
Tanto #update_attributes
como #save
comprobarán primero si la instancia de su modelo es #valid?
Antes de continuar para escribir en la base de datos. Si la instancia de tu modelo no es #valid?
, entonces estos métodos devolverán falso. Para ver qué está mal con su instancia de modelo, eche un vistazo a los #errors
su modelo.
Rails.logger.info(@user.errors.messages.inspect)
O, incrustado en su método,
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