Rails 3 - разработка: как пропустить 'current_password' при редактировании регистрации? - PullRequest
12 голосов
/ 04 ноября 2010

Я реализовал omniauth с моей моделью устройства, поэтому я могу проходить аутентификацию, используя другие сервисы.Пароль больше не нужен для моей модели, так как пользователи могут проходить аутентификацию с помощью твиттера, фейсбука ...

Все работает нормально, но, когда пользователь пытается изменить свою регистрацию, разработчик пропускает процесс, потому что пользователь сделалне сообщаю 'текущий_пароль' (который в некоторых случаях не существует).

Я создал контроллер регистрации для перезаписи устройства:

class RegistrationsController < Devise::RegistrationsController
  def update
    super
  end
end

Но я не нашел никакой документациио том, как пропустить проверку пароля, как я могу сделать это в своем действии обновления?

Ответы [ 5 ]

34 голосов
/ 21 февраля 2011

Как и выше, попробуйте добавить это в вашу модель пользователя:

# bypasses Devise's requirement to re-enter current password to edit
def update_with_password(params={}) 
  if params[:password].blank? 
    params.delete(:password) 
    params.delete(:password_confirmation) if params[:password_confirmation].blank? 
  end 
  update_attributes(params) 
end
10 голосов
/ 26 ноября 2010

У меня сработало следующее:

В моем контроллере пользователей в действии обновления у меня есть

params[:user].delete(:password) if params[:user][:password].blank?
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank?

Возможно, вы могли бы приспособить это к before_save обратному вызову?

1 голос
/ 14 июля 2016

есть более простой ответ, я не знаю, когда у devise появился этот метод, но я просто добавил

Model.update_without_password(params)

будет обновлять атрибуты без указания текущего пароля.

1 голос
/ 21 апреля 2013

Даже ответ был здесь некоторое время, я хочу опубликовать новый, так как я думаю, что у выбранного ответа есть небольшие недостатки. Возможно, на момент создания ответа его не было, но теперь в 2013 ответ будет таким:

Решение было бы создать в User модель, подобную этой:

  # bypass re-entering current password for edit
  def update_with_password(params={}) 
    current_password = params.delete(:current_password)

    if params[:password].blank? 
      params.delete(:password) 
      params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 

    clean_up_passwords
  end
0 голосов
/ 14 мая 2019

На момент разработки v4.6.2 .Это очень легко сделать.

Как сказано в документации :

По умолчанию мы хотим требовать проверки пароля при обновлении.Вы можете перезаписать этот метод в своем собственном Контроллере RegistrationsController.

Это означает, что в вашем контроллере переопределите метод update_resource для замены update_with_password на update_without_password:

class Users::RegistrationsController < Devise::RegistrationsController

  # ...

  protected

  def update_resource(resource, params)
    resource.update_without_password(params)
  end
end
...