Rails 3 - Devise: Как пропустить "current_password" при редактировании регистрации?
Я внедрил omniauth с моей моделью разработки, поэтому могу аутентифицироваться с использованием других сервисов.
Пароль больше не нужен для моей модели, так как пользователи могут аутентифицироваться с помощью твиттера, facebook...
Все работает нормально, но когда пользователь пытается отредактировать свою регистрацию, придумайте пропустить процесс, потому что пользователь не сообщил "current_password" (который в некоторых случаях не существует).
Я создал контроллер регистрации, чтобы перезаписать его:
class RegistrationsController < Devise::RegistrationsController
def update
super
end
end
Но я не нашел документацию о том, как пропустить проверку пароля, как я могу это сделать в своем действии по обновлению?
Ответы
Ответ 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