我有一个rails应用程序,超级管理员可以手动创建新用户。我需要向新用户发送一封电子邮件,以便重置密码并连接到他的空间。
所以我尝试使用reset_password_token手动生成edit_user_password_path并将其发送到用户的电子邮件中:
def create
raw, reset_password_token = Devise.token_generator.generate(
User, :reset_password_token
)
@user = User.new(user_params)
@user.reset_password_token = reset_password_token
@user.reset_password_sent_at = Time.now.utc
reset_password_url = Rails.configuration.endpoints['front'].to_s + Rails.application.routes.url_helpers.edit_user_password_path(reset_password_token: reset_password_token)
# it generates http://localhost:3000/users/password/edit?reset_password_token=my_token_sent_by_email link, so it's good
if @user.save(validate: false)
AdminMailer.welcome_email(@user, reset_password_url).deliver
render 'index'
else
render 'new'
end
end
我的user_params方法是私有方法:
def user_params
params.require(:user).permit(:name, :email, :role)
end
但是当我按照生成的edit_password_link并尝试重置密码时,我会从设计中获得token_invalid错误。
当我尝试在Rails控制台中执行此操作时:
User.find_by(reset_password_token, my_token_sent_by_email)
我从数据库中找到了记录。
但是当我为想要使用devise的send_reset_password_instructions更改密码的用户初始化重置密码链接时,它可以正常工作:
def send_pass
@user = User.find(params[:id])
@user.send_reset_password_instructions
redirect_back(fallback_location: root_path)
end
有人可以解释我的错误吗? 感谢所有答案
答案 0 :(得分:0)
所以,最后我找到了解决方案。
当我们使用
生成令牌时raw, reset_password_token = Devise.token_generator.generate(User, :reset_password_token)
我们需要在数据库中保存reset_password_token(使用corse的reset_password_sent_at,但我们需要在edit_password_link中发送raw:
reset_password_url = Rails.configuration.endpoints['front'].to_s + Rails.application.routes.url_helpers.edit_user_password_path(reset_password_token: raw)