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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

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

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1308閲覧

[Rails]DeviseとDeviseAuthTokenでの環境下での確認メール送信方法

yasukun252

総合スコア34

Ruby on Rails 5

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

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2023/02/28 04:51

編集2023/02/28 04:57

実現したいこと

  • RailsとDeviseとDeviseAuthTokenの両方を仕様して、WebとAPIでメール認証を行いたい。
  • Webから登録した場合のみ、アカウント認証メールが送信されない(letter_openerで確認できない)問題を解決したい

前提

RailsとDeviseとDeviseAuthTokenの両方を仕様してユーザー認証を実装しております。
WebでもAPIの方でもアカウント登録、ログインまでは上手く実装できました。
しかし、Deviseの「confirmable」の機能を追加して、アカウント認証メールをletter_openerにて確認しましたが、Webから登録するとアカウント認証メールがletter_openerで確認できません。ログを見てもメールを送信していないです。

しかし、APIの方でも登録してみるとアカウント認証メールをletter_openerにて確認できました。ログを見るとメールは配信されておりました。

該当のソースコード(Web)

app/controllers/users/registrations_controller.rb

1class Users::RegistrationsController < Devise::RegistrationsController 2end

app/controllers/users/sessions_controller.rb

1class UserFrontend::Users::SessionsController < Devise::SessionsController 2 private 3 4 def sign_up_params 5 params.require(:registration).permit(:name, :email, :gender, :password, :password_confirmation) 6 end 7end

app/controllers/application_controller.rb

1class ApplicationController < ActionController::Base 2 protect_from_forgery with: :null_session, if: -> { request.format.json? } 3 before_action :configure_permitted_parameters, if: :devise_controller? 4 5 def configure_permitted_parameters 6 devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) 7 end 8 9 # ログイン後の遷移画面 10 def after_sign_in_path_for(resource) 11 mypage_path 12 end 13 14 # ログアウト後の遷移画面 15 def after_sign_out_path_for(resource) 16 new_user_session_path 17 end 18 19 # 与えられたユーザーがログイン済みユーザーであればtrueを返す 20 def current_user?(user) 21 user && user == current_user 22 end 23 24 helper_method :current_user? 25end

app/views/users/registrations/new.html.slim

1 h2 新規登録 2= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| 3 = render "users/shared/error_messages", resource: resource 4 5 p.user-name 6 = f.label :name 7 = f.text_field :name 8 9 p 10 = f.label :email 11 = f.email_field :email, autofocus: true, autocomplete: "email" 12 13 p.select 14 = User.human_attribute_name(:gender) 15 = f.radio_button :gender, :man 16 = f.label :gender_0 17 = f.radio_button :gender, :woman 18 = f.label :gender_1 19 = f.radio_button :gender, :other 20 = f.label :gender_2 21 22 p 23 = f.label :password 24 - if @minimum_password_length 25 em 26 | ( 27 = @minimum_password_length 28 | characters minimum) 29 br 30 = f.password_field :password, autocomplete: "new-password" 31 32 p 33 = f.label :password_confirmation 34 = f.password_field :password_confirmation, autocomplete: "new-password" 35 36 p 37 = f.submit "Sign up" 38

該当のソースコード(API)

app/controllers/api/v1/auth/registrations_controller.rb

1class Api::V1::Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController 2 include DeviseTokenAuth::Concerns::SetUserByToken 3 4 def render_create_success 5 render json: { 6 status: 'CREATE ACCOUNT SUCCESS', 7 data: resource_data(resource_json: @resource.token_validation_response) 8 }, scope: :current_api_v1_user 9 end 10 11 private 12 13 def sign_up_params 14 params.require(:registration).permit(:name, :email, :gender, :password, :password_confirmation) 15 end 16end 17

app/controllers/api/v1/auth/sessions_controller.rb

1class Api::V1::Auth::SessionsController < DeviseTokenAuth::SessionsController 2 include DeviseTokenAuth::Concerns::SetUserByToken 3 4 def render_create_success 5 render json: { 6 status: 'SUCCESS LOGIN', 7 data: resource_data(resource_json: @resource.token_validation_response) 8 }, scope: :current_api_v1_user 9 end 10end 11

app/controllers/api/v1/application_controller.rb

1class Api::V1::ApplicationController < ActionController::Base 2 include DeviseTokenAuth::Concerns::SetUserByToken 3 protect_from_forgery with: :null_session 4end

該当のソースコード(WebとAPI共通)

app/models/user.rb

1class User < ApplicationRecord 2 # Include default devise modules. 3 devise :database_authenticatable, :registerable, 4 :recoverable, :rememberable, :validatable, :confirmable 5 # :trackable 6 include DeviseTokenAuth::Concerns::User 7end

config/routes.rb

1Rails.application.routes.draw do 2 devise_for :users, controllers: { 3 registrations: "users/registrations", 4 sessions: "users/sessions" 5 } 6 resources :users 7 8 namespace :api, default: { format: :json } do 9 namespace 'v1' do 10 mount_devise_token_auth_for 'User', at: 'auth', controllers: { 11 registrations: "api/v1/auth/registrations", 12 sessions: "api/v1/auth/sessions"} 13 14 resources :users 15 end 16 end 17 18 19 if Rails.env.development? 20 mount LetterOpenerWeb::Engine, at: "/letter_opener" 21 end 22end

Gemfile

1source 'https://rubygems.org' 2git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 4ruby '2.6.0' 5 6gem 'rails', '5.2.8' 7gem 'rack-cors' 8gem 'devise' 9gem 'devise_token_auth' 10 11group :development do 12 gem 'letter_opener' 13 gem 'letter_opener_web' 14end 15 16

config/initializers/cors.rb

1Rails.application.config.middleware.insert_before 0, Rack::Cors do 2 allow do 3 origins '*' 4 resource '*', 5 headers: :any, 6 expose: ['access-token', 'uid', 'client', 'expiry', 'token-type'], 7 methods: [:get, :post, :put, :patch, :delete, :options, :head] 8 end 9end 10

試したこと

APIの方では以下のコマンドでユーザー登録すると、ユーザーが作成されアカウント確認メールが送信されます。(letter_openerで確認できます)

terminal

1curl localhost:3000/api/v1/auth -X POST -H 'Content-Type: application/json' -d '{"email": "test@example.com", "gender": 1, "password": "password","password_confirmation": "password", "name": "test", "confirm_success_url":"http://localhost:3000/sign_in"}' -i

Webの方では上記の新規登録フォームからユーザー登録してもユーザーは作成されますが、アカウント確認メールは送信されません。(エラーなどは出ておりません)

Webから新規登録した場合のみ、アカウント認証メールがletter_openerで確認できない原因が分かりません。

何卒、アドバイスなどよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Rails(5.2.8)、ruby(2.6.0)になります。

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

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

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

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

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

guest

回答1

0

自己解決

理由は分かりませんが、以下のように修正するとメールが配信されました。(順番を逆にするように変更)

include DeviseTokenAuth::Concerns::User devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable

投稿2023/03/01 17:47

yasukun252

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問