前提と目標
フロントに 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のドキュメントが、自分の力ではまだなかなか読めず、知識がつながっていないため、どこをどのように書き換えればいいか、方針さえ浮かばない状況です。どなたかご存知の方、お力添えをいただければと思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。