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

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

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

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

Ruby

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

192閲覧

devise, devise_token_authで、メール認証がうまくできない。

inoda

総合スコア11

Devise

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

Ruby

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2024/08/10 10:54

前提と目標

フロントに React(Vite)、バックに Rails7系 APIモード、DBに MySQLをDockerで環境構築して開発しています。
ユーザー登録の際、確認メールを送り、URLを踏んだら認証完了という、よくあるメール認証を実装したいです。

ユーザー周りは、deviseと、フロントとバックを分ける場合に使われている devise_token_auth を使っています。

起きている問題

❯ curl -X POST http://localhost:3001/api/auth \ -d "name=適当な名前" \ -d "email=有効なメールアドレス" \ -d "password=有効なパスワード" \ -d "password_confirmation=有効なパスワード" \ -d "confirm_success_url=https://localhost:3000"

のように、APIモードのrailsで直接リクエストを送った時、NoMethodErrorや、UnknownAttributeErrorが起きます。

試したことと結果

・UnknownAttributeErrorが出た時
registrations_controller.rbに、params.permit(:name, :email, :password, :password_confirmation, :confirm_success_url) のように、通すパラメータを追加した時)のエラー

{"status":500,"error":"Internal Server Error","exception":"#\u003cActiveModel::UnknownAttributeError: unknown attribute 'confirm_success_url' for User.\u003e", ..(省略)

NoMethodErrorが出る時
params.permitに confirm_success_url を入れていない場合、

{"status":500,"error":"Internal Server Error","exception":"#\u003cNoMethodError: undefined method `deliver_method=' for class ActionMailer::Base\u003e", ..(省略)

のようなエラーがでます。

サーバー側のログを見ると、
params.permit()に confirm_success_url がある時(UnknownAttributeErrorの場合)は、SQL文が失敗していて、ユーザーは作成されていません。

なので、params.permitに confirm_success_url はいらないのかもしれません。devise_token_authのドキュメントには必要って書いてますが…

以下、サーバー側のログの一部で、NoMethodErrorが起きた時です。

TRANSACTION (0.1ms) BEGIN User Exists? (1.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = '伏せています' AND `users`.`provider` = 'email' LIMIT 1 User Create (0.9ms) INSERT INTO `users` (`provider`, `uid`, `encrypted_password`, `reset_password_token`, `reset_password_sent_at`, `allow_password_change`, `remember_created_at`, `confirmation_token`, `confirmed_at`, `confirmation_sent_at`, `unconfirmed_email`, `name`, `nickname`, `image`, `email`, `tokens`, `created_at`, `updated_at`) VALUES 有効なアドレスなどがあるため伏せています TRANSACTION (3.9ms) COMMIT /usr/local/bundle/gems/actionmailer-7.1.3.4/lib/action_mailer/base.rb:498: warning: already initialized constant ActionMailer::Base::PROTECTED_IVARS /usr/local/bundle/gems/actionmailer-7.1.3.4/lib/action_mailer/base.rb:498: warning: previous definition of PROTECTED_IVARS was here Completed 500 Internal Server Error in 279ms (ActiveRecord: 7.0ms | Allocations: 12384) NoMethodError (undefined method `deliver_method=' for class ActionMailer::Base):

ソースコード

メールに関する設定は、deviseやdevise_token_authのドキュメントから自分で見つけられなかったので、ネットにある記事を参考にしました。

ruby:development.rb

1# development.rb での記載です。 2 3 # メール送信元の設定 4 config.action_mailer.default_options = {from: '伏せています'} 5 # メール送信時、生成されるリンクのホスト部分の設定 6 config.action_mailer.default_url_options = {host: 'localhost:3001'} 7 # メールの送信方法(simple mail transfer protocol) 8 config.action_mailer.deliver_method = :smtp 9 # SMTPのサーバー設定 10 config.action_mailer.smtp_settings = { 11 address: 'smtp.gmail.com', 12 port: 587, 13 domain: 'gmail.com', 14 user_name: '伏せています', 15 password: '伏せています', 16 authentication: 'plain', 17 enable_starttls_auto: true 18 } 19 20 21# devise.rb の方にも、config.mailer_sender = "伏せています" と記載をしています

また、application_mailer.rb の方は、

ruby:application_mailer.rb

1class ApplicationMailer < ActionMailer::Base 2 default from: "私のメールアドレスのため、伏せています" 3 layout "mailer" 4end 5

のように、最低限だけ書いています。

deviseやdevise_token_authのドキュメントが、自分の力ではまだなかなか読めず、知識がつながっていないため、どこをどのように書き換えればいいか、方針さえ浮かばない状況です。どなたかご存知の方、お力添えをいただければと思います。

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

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

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

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

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

guest

回答1

0

自己解決

筋金入りのアホです自分。deliver_for ではなく、derivery_for です。タイポでした。
こういうのは、自分で書かずにドキュメントからコピペするに限りますね。

投稿2024/08/20 09:17

inoda

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問