0

У меня есть система auth с нуля, и когда пользователь нажимает на «редактировать профиль», он должен вводить текущий пароль независимо от поля, которое он хочет редактировать.Проверка подлинности Rais с нуля, проверка текущего пароля

def update 
    if params[:user][:password].present? 
    authenticated = @user.authenticate(params[:user][:current_password]) 
    if authenticated && @user.update(user_params) 
     redirect_to root_url 
     flash[:notice] = "Your profile was successfully updated!" 
    else 
     @user.errors.add(:current_password, 'is invalid') unless authenticated 
     render :edit 
    end 
    elsif @user.update(user_params) 
    redirect_to root_url 
    flash[:notice] = "Your profile was successfully updated!" 
    else 
    render :edit 
    end 
end 

Как я могу назвать проверку подлинности или использовать некоторые проверки контекста модели только для сценария, когда пользователь хочет изменить свой пароль?

ответ

0

Вы можете создать вложенную если-то еще в этом заявлении, что действие будет проверять на наличие new_password и new_password_confirmation (или независимо от того, новый пароль и подтверждение поля называются) в params[:user] объекта. Если они присутствуют - вы можете перенаправить на какой-то король страницы с просьбой ввести существующий пароль.

Другой способ - использовать ajax для асинхронного отображения диалогового окна с тем же запросом (например, response_with self-invoking javascript function, который обрабатывает это). Затем откройте кнопку отправки в диалоговом окне в другом действии контроллера.

Update (с учетом использования валидаторов):

Учитывая проверку вы можете написать свое собственный validator (пароль) и условие, чтобы проверить, когда новое поле пароля приходят некоторые данные от клиента.

Я думаю, что это может выглядеть следующим образом:

validate :password_update? 

def password_update? 
    if new_password.present? 
     if current_password !== self.password 
      errors.add(:current_password, "must be supplied!") 
     else 
      # update data and password 
     end 
    else 
     # do your regular update 
    end 
end 
1

Я бы не рекомендовал смешивания эту логику в модель, потому что вы в конечном итоге со сложностью, что трудно следовать, как приложение растет с течением времени.

Попробуйте взглянуть в виде объектов:

я бы реализовать что-то вроде этого:

class UserUpdateForm 
    include ActiveModel::Model 

    # Attributes 
    attr_accessor :user, :new_password, :new_password_confirmation 

    # Validations 
    validates :current_password, if: :new_password 
    validate :authenticate, if: :current_password 
    validates :new_password, confirmation: true, allow_blank: true 

    def initialize(user) 
    self.user = user 
    end 

    def submit(params) 
    self.new_password = params[:new_password] 
    self.new_password_confirmation = params[:new_password_confirmation] 

    if self.valid? 
     # Set other attributes as needed, then set new password below. 
     self.user.password = self.new_password if self.new_password.present? 
     self.user.save 
    else 
     false 
    end 
    end 

private 

    def authenticate 
    unless self.authenticate(self.current_password) 
     self.errors.add(:current_password, 'is invalid') 
    end 
    end 
end 

Тогда вы можете вызвать его из ваш контроллер:

def update 
    @user_update_form = UserUpdateForm.new(@user) 

    if @user_update_form.submit(params) 
    flash[:notice] = "Your profile was successfully updated!" 
    redirect_to root_url 
    else 
    render :edit 
    end 
end 

См. Ссылки выше, как обрабатывать вид и т. Д. Это только для того, чтобы вы начали.

+0

Уверенный выглядит хорошо, но как я могу сделать еще один шаг, чтобы пропустить аутентификацию пользователя, если поля пароля не изменены? Я редактировал свой вопрос, но код выглядит довольно уродливо. –

+0

Могу ли я сделать что-то вроде скрытого логического поля, которое устанавливает true, когда заполняется любое поле пароля или поменяются поля пароля (я скрываю их и переключаю с помощью jquery) и проверяю на основе логического значения? –

+0

Я не читал последнее утверждение в вашем вопросе достаточно хорошо. Я думал, что вы хотите потребовать текущий пароль, несмотря ни на что. Я попробую обновить свой ответ. –

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