在特定用例的应用程序中,我创建了一个新用户(通过编程设置密码),并向他们发送确认邮箱.

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

实际上,我想要

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

任何帮助/指点都很好.

推荐答案

这是一个简单的方法,用户只需一步就可以确认邮箱地址,并使用您建议的链接设置初始密码...

发送一个你的应用程序生成的邮箱,包括一个ReSeTyPaseWordBy令牌,并考虑用户拥有该邮箱地址有效性的令牌确认.

在系统帐户生成代码中,假设用户模型设置为:可恢复和:数据库可验证设计模块...

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

当用户设置初始密码时,让Desive reset password视图更清晰.

查看/设计/密码/编辑.html.雇员再培训局

...
<%= "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.

无需在您的用户模型中包含:confirmable designe模块,因为如果没有邮箱中的重置密码令牌,您的应用程序创建的帐户将无法访问.

Desive将处理提交并清除reset_password_token字段.

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

如果您想使用Desive :confirmable模块而不是这种方法,请参阅Devise wiki page.

Ruby-on-rails相关问答推荐

一对多关联 counter_cache 在 Rails 中无法正确重新加载

从 rails 5 迁移到 rails 6

在哈姆尔与当地人进行局部渲染?

未初始化的常量 ActionDispatch::Session::EncryptedCookieStore (NameError)

如何获取 Ruby on Rails 生成的表单元素 id 以供 JavaScript 参考?

控制器规格与请求规格?

从控制器中删除 Cookie

rails 模型 has_many 本身

Rails 3:验证组合值

DateTime.now 还是 Time.now?

Rails,获取模型中的资源路径

不允许请求来源:使用 Rails5 和 ActionCable 时的 http://localhost:3001

参数错误:范围主体需要可调用

Rails:进行不可逆转的迁移是不是很糟糕?

减go Ruby 中的日期并以分钟为单位得到差异

通过 Ruby 或 Rails 的 LDAP

rbenv:没有 gemsets 生存

为什么 RSpec 在 Rails 下这么慢?

在 Rails 中命名布尔列

find、where 和 find_by_id 有什么区别?