У Devise, якщо я зміню пароль користувача та після оновлення в базі даних, сайт негайно вийде з системи. Я не хочу такої поведінки - як мені це робити. будь ласка, допоможіть.
У Devise, якщо я зміню пароль користувача та після оновлення в базі даних, сайт негайно вийде з системи. Я не хочу такої поведінки - як мені це робити. будь ласка, допоможіть.
Відповіді:
У мене була та сама проблема, і, здається, такий код працює для мене.
Припустимо, що контролер паролів встановлений для одиночного маршруту. Також припустимо, що автентифікована модель - це Обліковий запис. При цьому у вас є таке:
def update
if current_account.update_with_password(params[:account])
sign_in(current_account, :bypass => true)
flash[:notice] = 'Password updated.'
redirect_to account_path
else
render :action => :show
end
end
Ключовим інгредієнтом є виклик методу sign_in, який намагається повторно ввійти в обліковий запис, але обходить зворотні виклики керівника та зберігає рахунок у сеансі.
sign_outвище sign_in, спочатку захопіть модель у змінну екземпляра, щоб ви могли передати її через sign_inметод, інакше ви будете передавати nil.
Наведений вище приклад не спрацював для мене, використовуючи кілька областей в 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, щоб користувачі не виходили під час деяких дій. Оглянувшись назад; не гарна ідея! Такий підхід набагато кращий! Будучи тим, що безпечніше створювати власні контролери проти перевизначення коду Devise, якщо цього абсолютно не уникнути.
sign_out current_userале потребував sign_in :user, @user, bypass: true.
Ви можете просто встановити sign_in_after_reset_passwordу вашомуdevise.rb
config.sign_in_after_reset_password = true
Оновлення до відповіді Білла Айзенхауера вище -
sign_in(current_account, :bypass => true)bypass_sign_in current_accountзамість цього було припинено
Більш детальну інформацію можна знайти тут: http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#bypass_sign_in-instance_method
Додайте наступний фрагмент коду до свого методу, в якому ви оновлюєте пароль користувача, відразу після оновлення пароля користувача в базі даних:
def update
. . . . .<your code>
. . . . .<your code>
sign_in(@user, :bypass => true)
. . . . .<your code>
. . . . .<your code>
end
З якихось причин current_userне дорівнює, @userхоча current_user.idдорівнює @user.id. Тож я повинен використовувати sign_in(@user, :bypass => true).
user.reload
Будь ласка, зверніться до цієї відповіді тут, я спробував усі вищезазначені відповіді. Це не працює, якщо не додати область. https://stackoverflow.com/a/30418266/4973585
Це не працює -
sign_in @user, bypass: true
Це працює -
sign_in :user, @user, bypass: true
Використовуйте реєструваний модуль, який дозволить вам як зареєструватися, так і редагувати функції користувача
https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password