在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方法调用,它试图重新登录帐户,但绕过监管者回调并将帐户存储到会话中。
上面的例子对我在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_in(current_user, :bypass => true)
你可以简单地在你的sign_in_after_reset_password
中设置devise.rb
config.sign_in_after_reset_password = true
在更新数据库中的用户密码后立即将以下代码添加到更新用户密码的方法中:
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)
。
Bill Eisenhauer的更新回答如上 -
sign_in(current_account, :bypass => true)
已被弃用,而不是使用bypass_sign_in current_account
使用可注册模块,它将为您提供注册和编辑用户功能
https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password