質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

643閲覧

Ruby on Rails チュートリアル アカウント有効化メールの再送機能

jack20xx

総合スコア45

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/10/01 01:13

編集2022/10/03 10:58

前提

Ruby on Rails チュートリアルをひととおり学び、webアプリを開発中ですが、改めて第11章のアカウント有効化メールについて気になったので質問させていただきます。
第11章を進めると、アカウントの有効化メールを送信できるようになりますが、送信は一度きりで、再送することができません。
公式ページの下部には再送機能を利用するには別途コードの追加が必要との記述があり、Devise gemを使う方法もあるそうですが、本チュートリアルではDeviseを使用していないため、使用せずに再送機能を追加できればと思っています。

疑問および実現したいこと

1. そもそも、なぜチュートリアルのとおりに進めていくと、送信機能は一度しか使えないのか?
2. Devise gemを使用せずにアカウント有効化メールの再送機能を追加したい

参考サイト

Railsチュートリアル公式ページ

https://railstutorial.jp/chapters/account_activation?version=5.0

第11章を終えた時点での公式サンプル

https://github.com/yasslab/sample_apps/tree/main/5_0/ch11

10/3 追記

ご回答を受け、メールの再送信を行うためのコントローラーを追加し、入力されたメールアドレスからユーザー情報を引き出して、アカウントの有効化メールの再送ができるように試行錯誤していますが、新たなエラーが出ていますので追記させていただきます。
新たに追加した機能周りに原因があると思うのですが、解決方法をお聞きできれば嬉しいです。

エラー内容

ActionController::UrlGenerationError in ResendActivations#create No route matches {:action=>"edit", :controller=>"account_activations", :email=>"#実際は入力されています", :id=>nil}, possible unmatched constraints: [:id]

エラーに該当していると思われる箇所

  1. account_activation_html
  2. user_mailer.rb
  3. user.rb
  4. resend_activations_controller.rb

  1. account_activation_html
<%= link_to "Activate", edit_account_activation_url(@user.activation_token, email: @user.email) %>

2. user_mailer.rb

class UserMailer < ApplicationMailer def account_activation(user) @user = user mail to: user.email, subject: "Account activation" end end

3. user.rb

class User < ApplicationRecord 〜 def send_activation_email UserMailer.account_activation(self).deliver_now end 〜 end

4. resend_activations_controller.rb

class ResendActivationsController < ApplicationController def new end def create @user = User.find_by(email: params[:resend_activation][:email].downcase) if @user.send_activation_email flash[:info] = "Please check your email to activate your account." redirect_to root_url else render 'resend' end end end

コメント

調べた限り、アカウント有効化メールの再送機能に関して取り扱ってる記事が極端に少なかったため、質問させていただきました。
初学者のため、至らない部分があれば申し訳ございません。
ご説明いただければ、大変うれしいです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

そもそも、なぜチュートリアルのとおりに進めていくと、送信機能は一度しか使えないのか?

ユーザーリソースの作成時のみでメールを送信しているからです。一度作成された後はそのリソースに対する更新もしくは削除しかできませんので、もう一度メールを送信するためには再度作成、つまり一度アカウントを削除して再度アカウント登録をする必要があるような作りになっています。

Devise gemを使用せずにアカウント有効化メールの再送機能を追加したい

メール送信は以下の行で行われています。

ruby

1UserMailer.account_activation(@user).deliver_now

画面から入力されたメールアドレス(必要であれば+でパスワード)をもとにユーザーを取得し、上記処理を行うようなアクションを作成するとよいかと思います。

投稿2022/10/01 05:25

Mugheart

総合スコア2344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jack20xx

2022/10/03 11:02

rhiroe様 ご解説ありがとうございます。 返信が遅くなってしまい申し訳ございません。 あれから数日、頂いた情報を元に試行錯誤していましたが、メールの送信に関しましてエラーが出ましたので、どのように改善すれば有効化メールの再送ができるかご教授いただけると嬉しいです。 新たに情報を追記しましたので、ご確認いただければ幸いです。
Mugheart

2022/10/06 02:20

account_activation_html の edit_account_activation_url の引数に id: @user.id の指定が必要なのではないでしょうか
Mugheart

2022/10/06 02:23

id: @user.id と書きましたが、:idキーの引数が必要という話で、値が本当に @user.id なのかどうかはわかりません。
jack20xx

2022/10/07 02:42

お返事ありがとうございます。過去の質問や他サイトの記事を参考に解決にたどり着くことができました。 解決方法に関しましては、別途まとめさせていただきました。 ご回答ありがとうございました。
guest

0

自己解決

10/3追記分
2. Devise gemを使用せずにアカウント有効化メールの再送機能を追加したい

Rails Tutorial 11章のテストが通りません」を参考に、
create_activation_digestをメールの送信前にbefore_actionとして呼び出すことで、送信できるようになりました。
上記の回答によると、:idで与えられるべきものは@user.activation_tokenだったようで、このidを取得するためにはcreate_activation_digestが必要ということでした。

ご閲覧、ご回答いただき誠にありがとうございました。

投稿2022/10/07 02:42

編集2022/10/09 17:31
jack20xx

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問