#ruby-on-rails
#ruby-on-rails
Вопрос:
В моей форме обновить профиль пользователя в первом поле пользователю предлагается ввести свой текущий пароль. Когда она отправляет форму, я проверяю пароль, прежде чем принять изменения в других полях. Вот как я сейчас делаю это в пользовательском контроллере:
def update
@user = User.find(params[:id])
if @user.has_password?(params[:user][:password])
if @user.update_attributes(params[:user])
flash[:success] = "Profile updated."
redirect_to @user
else
render 'edit'
end
else
flash[:failure] = "Password does not match!"
render 'edit'
end
end
Я чувствую, что есть лучший способ сделать это. Например, я мог бы сделать проверку соответствия пароля в пользовательской модели. Тогда formtastic автоматически обработал бы сообщение об ошибке для меня (в отличие от моего уродливого подхода flash выше). Я пытался сделать это с
validate :password_match?, :on => :update
И
def password_match?
has_password(params[:user][:password])
end
Но, как и предполагалось, params недоступен из модели.
Я искал SO в течение 20 минут способ сделать это, но не смог найти ничего, что не касалось Devise или Authlogic. Я выполняю аутентификацию с нуля (все работает нормально: вход, сеансы и т.д.).
Пожалуйста, покажите мне лучший способ!
Комментарии:
1. Если бы вы использовали devise , это было бы встроено для вас в представлении редактирования регистрации пользователя
2. В следующий раз я обязательно использую devise. Недавно я изучил Rails и следовал руководству, которое включало в себя построение аутентификации с нуля. С тех пор я работаю над этим кодом для своего проекта.
Ответ №1:
Вам не нужно разрабатывать, просто используйте фильтр before на вашем контроллере при обновлении вашего контроллера профиля.
before_filter password_match, :only => :update
затем внизу как private.
private
def password_match
@user = User.find(params[:id])
@user.has_password?(params[:user][:password])
Комментарии:
1. Этот путь завел меня в кроличью нору. Перетаскивать вас в контекст, вероятно, не стоит, нам пришлось бы возвращаться туда и обратно несколько раз. Я просто собираюсь придерживаться своего оригинального решения. Я думаю, это может быть связано с тем, что я не знаю, как использовать errors.add правильно, чтобы добавить пользовательскую ошибку в поле пароля. В любом случае, принимаю ответ, потому что это было хорошее предложение.
2. Иди выпей кофе и отдохни секунду. Вам не нужны ошибки.добавьте, как насчет приятной флэш-ошибки в верхней части экрана? просто добавьте flash.now[:error] = ‘Пароль не соответствует вашему текущему паролю’ и все 🙂
3. на самом деле, именно таким был мой первоначальный подход, смотрите первый пример кода выше. Я решил придерживаться этого.