15

esperando que alguien aquí pueda señalarme en la dirección correcta.rails update_attributes devuelve false cuando se intenta actualizar los valores db

Tengo un controlador Actualización def ejecutando "atributos_actualización". Actualmente devuelve falso, sin mensaje de error. Soy bastante nuevo para Ruby, pero no para la codificación, ¡y esto me ha dejado perplejo durante unos días! Estoy tratando de actualizar el modelo de usuario y db con los valores especificados 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 edición def ....

def edit 
    @user = current_user 
end 

El formulario envía el 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 development.log (lo siento que es un poco desordenado) ....

Started PUT "https://stackoverflow.com/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) 

puede uno ayudar a señalar dónde voy mal, por favor?

¡Gracias de antemano!

+0

¿Has comprobado 'development.log'? – Alex

+0

Una descripción del mensaje de error sería agradable - no sé cómo está obteniendo 'false' – Jonathan

+0

añadido output.log de salida en la publicación principal .... (acaba de obtener una reversión) – steve

Respuesta

39

Ambos #update_attributes y #save primero verificará si la instancia de su modelo es #valid? antes de continuar escribiendo a la base de datos. Si la instancia de su modelo no es #valid?, estos métodos devolverán falso. Para ver qué pasa con la instancia de su modelo, eche un vistazo a #errors de 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 
+0

Eso es todo! ¡Eso es exactamente lo que necesitaba! El registro de errores reveló que me faltaba un campo que debía actualizarse junto con estos. Muchas gracias, ahora sé cómo depurar correctamente estos errores también! :-) – steve

+1

Me enfrento a un problema similar ahora, probé Rails.logger.info (@ user.errors.messages.inspect) y me devuelve "Verdadero". Qué significa eso? Tengo que actualizar una columna y he agregado la columna en attr_accessible. mientras lo actualizo, me devuelve falso y la consulta que está ejecutando también es extraño. Eche un vistazo aquí http://paste.lisp.org/+2S4Y No puedo actualizar los campos. ¿Cuál puede ser el problema? –

+0

@JyotiRanjan compruebe '@ user.errors.messages.inspect' funciona al menos en mi caso con Rails 4.2 – jmarceli

4

También puede obtener una mejor introspección al actualizar atributos llamando update_attributes! lugar, lo que plantea excepciones en lugar de devolver falsa.

Cuestiones relacionadas