2015-05-07 2 views
4

Я нахожусь на рельсах 4.2.1 и придумываю 3.4.1. Я в принципе хочу 2 вещи в то же самое время:Позвольте пользователю обновить свой пароль без текущего пароля в разработке

Allow users to edit their password

и

Allow users to edit their account without providing a password

мне удалось, чтобы они работают отдельно. Но решение 1 для первой проблемы, кажется, несовместимо с единственным официальным решением для второй проблемы, потому что для последнего мне нужно переопределить регистрационный контроллер.

Поэтому я попытался сделать решение 1 работу в регистрации контроллер, а не приложения один:

class Users::RegistrationsController < Devise::RegistrationsController 
    before_filter :configure_account_update_params, only: [:update] 

    protected 

    def configure_account_update_params 
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:name, :password, :password_confirmation, :current_password) } 
    end 

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

end 

Таким образом, только добавили атрибут как имя обновляется, а пароль полностью отфильтрован. Я не уверен, что я должен начать тяжелую настройку, как в решениях 2 и 3 для такой простой цели. Я что-то пропустил?

ответ

3

После копания в разработке кода я узнал, что update_without_password удаляет нарочно :password и :password_confirmation params. Это делается по умолчанию по соображениям безопасности.

Так что (может быть рискованно) решение было переопределить update_without_password в моей модели ресурсов, как это, но без удаления паролей * Params

7

Добавьте это в registrations_controller:

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

И переопределить метод update_withour_password в вашей модели пользователя или модели, использующей Devise:

def update_without_password(params, *options) 

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

    result = update_attributes(params, *options) 
    clean_up_passwords 
    result 
    end