update_columns rails active ruby-on-rails ruby ruby-on-rails-3 controller update-attributes

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