私のアプリでは、特定のユースケースのために新しいユーザーを作成し(プログラムでパスワードを設定)、確認メールを送信します。
確認後すぐにパスワードを変更できるようにしたい(送信したくないシステム生成のパスワードを入力しなくてもよい)
実際には、
1) システムが生成されたパスワードで新しいユーザー アカウントを作成します。2
) システムが確認メールを送信します。3
) ユーザーが確認をクリックし、パスワードを入力するようにリダイレクトされます (実際には、以下のような URL に送信されます)。
<a href="http://localhost:3000/users/password/edit?reset_password_token=v5Q3oQGbsyqAUUxyqLtb">Change my password</a>
どのような助けやアドバイスもいただければ幸いです。
ベストアンサー1
提案されたリンクを使用して、ユーザーが電子メール アドレスを確認し、初期パスワードを設定する手順を 1 つだけ実行する簡単な方法です...
アプリが生成した reset_password_token を含むメールを 1 通送信し、ユーザーがそのトークンを所有していることをそのメール アドレスの有効性の確認とみなします。
システム アカウント生成コードでは、ユーザー モデルが :recoverable および :database_authenticatable Devise モジュールで設定されていると想定しています...
acct = User.new
acct.password = User.reset_password_token #won't actually be used...
acct.reset_password_token = User.reset_password_token
acct.email = "[email protected]" #assuming users will identify themselves with this field
#set other acct fields you may need
acct.save
初期パスワードを設定するときに、デバイス パスワード リセット ビューをユーザーにとってもう少しわかりやすくします。
ビュー/デバイス/パスワード/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.
アプリによって作成されたアカウントは、メール内の reset_password_token がないとアクセスされないため、User モデルに :confirmable Devise モジュールを含める必要はありません。
Devise は送信を処理し、reset_password_token フィールドをクリアします。
メソッドとフレンズの詳細についてはdevise_gem_folder/lib/devise/models/recoverable.rb
、 と を参照してください。database_authenticatable.rb
reset_password_token
:confirmable
この方法ではなくDeviseモジュールを使用する場合は、Devise ウィキページ。