Подтвердить что ты не робот

Rails 3 - Devise: Как пропустить "current_password" при редактировании регистрации?

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

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

Я создал контроллер регистрации, чтобы перезаписать его:

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

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

4b9b3361

Ответ 1

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

# bypasses Devise 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

Ответ 2

Следующие работали для меня:

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

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

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

Ответ 3

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

Ответ 4

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

Model.update_without_password(params)

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

Ответ 5

Начиная с версии 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