Rails update_attributes возвращает false при попытке обновить значения db

В надежде, что кто-то здесь может указать мне в правильном направлении.

У меня есть контроллер Update def running "update_attributes". В настоящее время он возвращает false, без сообщения об ошибке. Я новичок в Ruby, но не для кодирования, и это заставило меня занять несколько дней! Я пытаюсь обновить модель User и db со значениями, указанными ниже.

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

my edit def....

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'

И возвращаются параметры [: user]:

{"first_name"=>"Amanda", "last_name"=>"Ross", "is_owner"=>"1", "email"=>"[email protected]"}

Все эти поля находятся в attr_accessible в Модели, и я могу создать пользователя без каких-либо проблем.

здесь development.log output (извините, это немного грязно)....

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)

Может кто-нибудь может указать, где я ошибаюсь, пожалуйста?

Спасибо заранее!

Ответы

Ответ 1

Оба #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

Ответ 2

Вы также можете получить лучшую интроспекцию при обновлении атрибутов, вызвав вместо него update_attributes!, что вызывает исключения вместо того, чтобы просто возвращать false.