Rails的devise:设置密码重置令牌和redirect用户

在我的某个用例的应用程序中,我创build一个新用户(以编程方式设置密码),并向他们发送确认电子邮件。

我希望他们能够在确认后立即更改密码(无需进入系统生成的密码,我不想发送)

实际上,我想
1)系统用生成的密码创build一个新的用户帐户。
2)系统发送确认邮件。
3)用户点击确认,并redirectinput他们的密码(有效地发送到像下面的URL)

<a href="http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb">Change my password</a> 

任何帮助/指针将是伟大的。

一个简单的方法,让用户只需一步,确认电子邮件地址,并使用您build议的链接设置初始密码…

发送您的应用程序生成的一个电子邮件,包括一个reset_password_token,并考虑用户拥有该令牌确认该电子邮件地址的有效性。

在系统帐户生成代码中,假设用户模型设置为:可恢复和:database_authenticatabledevise模块…

 acct = User.new acct.password = User.reset_password_token #won't actually be used... acct.reset_password_token = User.reset_password_token acct.email = "user@usercompany.com" #assuming users will identify themselves with this field #set other acct fields you may need acct.save 

在设置初始密码时,为用户提供更清晰的设备重置密码。

视图/devise/口令/ edit.html.erb

 ... <%= "true" == params[:initial] ? "Set your password" : "Reset your password" %> ... 

生成的电子邮件

 Hi <%= @user.name %> An account has been generated for you. Please visit www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @user.reset_password_token %> to set your password. 

无需在用户模型中包含可确认的Devise模块,因为您的应用程序创build的帐户在电子邮件中没有reset_password_token时将无法访问。

devise将处理提交并清除reset_password_token字段。

有关devise_gem_folder/lib/devise/models/recoverable.rb方法和朋友的详细信息,请参阅devise_gem_folder/lib/devise/models/recoverable.rbdatabase_authenticatable.rb

如果你想使用Devise :confirmable模块而不是这种方法,请参阅Devise wiki页面 。

在Rails 4.1中,Anatortoise House的回复如下修改:

 user = User.new user.password = SecureRandom.hex #some random unguessable string raw_token, hashed_token = Devise.token_generator.generate(User, :reset_password_token) user.reset_password_token = hashed_token user.reset_password_sent_at = Time.now.utc user.email = 'user@usercompany.com' user.save! # Use a mailer you've written, such as: AccountMailer.set_password_notice(user, raw_token).deliver 

电子邮件视图有这个链接:

 www.oursite.com/users/password/edit?initial=true&reset_password_token=<%= @raw_token %> 

你可以打电话

 user.send(:set_reset_password_token) 

它可能不稳定,因为它是一个受保护的方法,但它可以为你的情况。 只是用一个testing覆盖它。

(在Devise v.3.4上testing)

这是我的邮件预览片段

 class Devise::MailerPreview < ActionMailer::Preview def reset_password_instructions user = User.last token = user.send(:set_reset_password_token) Devise::Mailer.reset_password_instructions(user, token) end end