Приведенный выше пример не работал для меня, используя несколько областей в Devise.
Мне пришлось добавить имя области / ресурса в путь sign_in, чтобы оно работало, и чтобы предотвратить хаос, мне также пришлось выйти из системы старого пользователя, иначе все виды путаницы будут в изобилии.
Изменения, которые мне нужно было сделать, выглядели бы примерно так, как в приведенном выше примере.
def update
if current_account.update_with_password(params[:account])
sign_out(current_account)
sign_in(:account, current_account, :bypass => true)
flash[:notice] = 'Password updated.'
redirect_to account_path
else
render :action => :show
end
end
Редактировать, чтобы добавить: я считаю, что мне пришлось принудительно выйти из системы, потому что где-то я перебил Devise'sкод, чтобы пользователи не выходили из системы во время определенных действий.Задним числом;не хорошая идея!Этот подход намного лучше!Дело в том, что безопаснее создавать свои собственные контроллеры по сравнению с переопределением кода Devise, если это абсолютно не неизбежно.