2013-05-15 3 views
2

Итак, у меня есть простая пользовательская модель и форма для обновления пароля.Rails проверяет уникальность при обновлении объекта? - очень странно

@user.update_attributes(:password=>params[:password]) 

Но это не сработало, и я понял:

User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" = 'z7KU4I0IXLjiRMpdF6SOVQ' LIMIT 1 
    User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."password_reset_token" = 'aMOjTN0ikPUOJo2JMVoDtQ' LIMIT 1 
    (0.0ms) BEGIN 
    User Exists (1.0ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1 
    (0.0ms) ROLLBACK 
Redirected to http://localhost:3000/edit_user_by_reset?reset_token=aMOjTN0ikPUOJo2JMVoDtQ 

По 3 выбору я могу сказать, что здесь не удалась проверка уникальности! И это причина для ROLLBACK. Но это не имеет смысла, конечно, в DB есть такая строка, так как это UPDATE-действие. Что мне делать? Я не хочу проходить :validate=>false здесь.

+0

Есть по крайней мере два пользователя с одинаковым адресом электронной почты, один имеет id = 1, другой - нет. –

+0

Перечитанный вопрос, очевидно, что есть такой пользователь, потому что он является действием UPDATE, он обновляет некоторые столбцы существующей строки –

+2

Я утверждаю, что User.find (1) .valid? вернет false. То, что вы считаете «очевидным», неверно. Запрос ищет * других * пользователей (т.е. те, у которых есть другой идентификатор), которые имеют один и тот же адрес электронной почты. –

ответ

2

Если вы хотите обновить только поле для пароля, вы не должны использовать метод mass_assignment update_attributes, вы должны использовать update_attribute(:password, params[:user][:password]).

Существует возможная ошибка с params[:password] хэша: если вы используете form_for @user, то вы должны иметь params[:user][:password] и в общем params[:user] для других полей.

Вы должны проверить, действительно ли данный пользователь (вы сохранили его в БД без проверки).

2

Проверьте, что ваш объект действителен до Вы звоните update_attributes.

@user.valid? 

Я потратил много времени, пытаясь отладить подобный вопрос только, чтобы найти, что мои данные плохо, чтобы начать с. Это не имело никакого отношения к update_attributes. После внесения изменений в запись БД, моя модель снова стала действительной после вызова @user.find(id) и update_attributes работала должным образом.

Смежные вопросы