Требует от пользователя ввода пароля для обновления профиля

#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. на самом деле, именно таким был мой первоначальный подход, смотрите первый пример кода выше. Я решил придерживаться этого.