🦦

【Rails7.0】アカウントの有効化ができない ~Invalid action link~

2023/08/25に公開

概要

「sign upをした後、送られてきたメール内のリンクをクリックすることでアカウントを有効化する」という機能を作成しているが、うまく機能を実装できない。

問題

sign upをした後、送られてきたメールのリンクをクリックしてもアカウントの有効化が成功しなかった。
有効化が成功すると、「Account Activated!」と表示されるはずですが、こちらの画像のような表示になってしまい、有効化ができない。

原因

受け取る側の問題ではなく、アクティベーション用に生成されたメール文面で、メールアドレスの指定に間違いとか先頭に空白や記号文字列がついているのかもしれない。

  1. メールは正しく送信されて、正しい宛先に届く
  2. メールのリンクをクリックすると、”3D” という文字列がくっついてコントローラにPOSTされてしまう
    もしこの状態なら、メールのテンプレートに空白文字や記号が入っちゃっているのかもしれません。
  • app/views/user_mailer/account_activation.text.erb
  • app/views/user_mailer/account_activation.html.erb
    になると思うので、
edit_account_activation_url(@user.activation_token, email: @user.email)

のところで変な文字や改行が入っていないか確認してみるべし。(text用、html用双方)

解決法

ここの9行目の余計な改行をなくす

app/views/user_mailer/account_activation.html.erb
<h1>Sample App</h1>

<p>Hi <%= @user.name %>,</p>

<p>
Welcome to the Sample App! Click on the link below to activate your account:
</p>

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

下記に変える

app/views/user_mailer/account_activation.html.erb
<h1>Sample App</h1>

<p>Hi <%= @user.name %>,</p>

<p>
Welcome to the Sample App! Click on the link below to activate your account:
</p>

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

もしそれでダメなら、editアクションのif構文「app/controllers/account_activations_controller.rb」の1行目を強制的に通るように修正する

app/controllers/account_activations_controller.rb
if user && !user.activated? && user.authenticated?(:activation, params[:id])
#下記に変更
if user.present?
app/controllers/account_activations_controller.rb
class AccountActivationsController < ApplicationController
    def edit
        user = User.find_by(email: params[:email])
        if user.present?
            user.activate
            log_in user
            flash[:success] = "Account activated!"
            redirect_to user
        else
            flash[:danger] = "Invalid activation link"
            redirect_to root_url
        end
    end
end

参考

https://teratail.com/questions/321831

まとめ

  • sign upをした後、送られてきたメールのリンクをクリックしてもアカウントの有効化が成功しなかった。
    有効化が成功すると、「Account Activated!」と表示されるはずですが、こちらの画像のような表示になってしまい、有効化ができない。

  • 原因は、受け取る側の問題ではなく、アクティベーション用に生成されたメール文面で、メールアドレスの指定に間違いとか先頭に空白や記号文字列がついているのかもしれない。

  • もしそれでダメならeditアクションのif構文「app/controllers/account_activations_controller.rb」の1行目を強制的に通るように修正する

Discussion