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

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

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

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

Ruby on Rails 7

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

Q&A

解決済

1回答

263閲覧

devise_token_authで、POSTリクエストのルーティングがマッチしない

inoda

総合スコア11

Devise

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

Ruby on Rails 7

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

0グッド

0クリップ

投稿2024/06/09 07:01

実現したいこと

フロントエンドに React, バックエンドに RailsAPI, DBにMySQLを置いて、dockerで運用しています。

devise_token_auth という gem を使って、簡単な認証機能を実装したいです。
フロント部分を全く導入できていないので、目下、curlコマンドを通してPOSTリクエストを送って正常にJSONが返ってくることを目標にしています。

発生している問題・分からないこと

❯ curl -X POST http://localhost:3001/api/auth \ -d "name=hoge" \ -d "email=test@example.com" \ -d "password=password" \ -d "password_confirmation=password"

とした時に、404エラーが発生します。

エラーメッセージ

error

1{"status":404, 2 "error":"Not Found", 3 "exception":"#\u003cActionController::RoutingError: No route matches [POST] \"/api/auth\"\u003e", 4 "traces":{"Application Trace":[] ... (以下略) 5}

該当のソースコード

config/routes.rb

1Rails.application.routes.draw do 2 namespace :api do 3 resources :test, only: [:index] 4 # 認証コントローラ(devise_token_auth) 5 mount_devise_token_auth_for 'User', at: 'auth', controllers: { 6 registrations: 'api/auth/registrations' 7 } 8 namespace :auth do 9 resources :sessions, only: [:index] 10 end 11 end 12end 13

app/controllers/api/auth/registrations_controller.rb

1class Api::Auth::RegistrationsController < DeviseTokenAuth::RegistrationsController 2 private 3 4 def sign_up_params 5 params.permit(:name, :password, :password_confirmation) 6 end 7end 8

app/controllers/application_controller.rb

1class ApplicationController < ActionController::API 2 include DeviseTokenAuth::Concerns::SetUserByToken 3 4 skip_before_action :verify_authenticity_token 5 helper_method :current_user, :user_signed_in? 6end 7
# rails routes の実行結果 ❯ docker compose exec api rails routes Prefix Verb URI Pattern Controller#Action api_test_index GET /api/test(.:format) api/test#index new_api_user_session GET /api/auth/sign_in(.:format) devise_token_auth/sessions#new api_user_session POST /api/auth/sign_in(.:format) devise_token_auth/sessions#create destroy_api_user_session DELETE /api/auth/sign_out(.:format) devise_token_auth/sessions#destroy new_api_user_password GET /api/auth/password/new(.:format) devise_token_auth/passwords#new edit_api_user_password GET /api/auth/password/edit(.:format) devise_token_auth/passwords#edit api_user_password PATCH /api/auth/password(.:format) devise_token_auth/passwords#update PUT /api/auth/password(.:format) devise_token_auth/passwords#update POST /api/auth/password(.:format) devise_token_auth/passwords#create cancel_api_user_registration GET /api/auth/cancel(.:format) api/auth/registrations#cancel new_api_user_registration GET /api/auth/sign_up(.:format) api/auth/registrations#new edit_api_user_registration GET /api/auth/edit(.:format) api/auth/registrations#edit api_user_registration PATCH /api/auth(.:format) api/auth/registrations#update PUT /api/auth(.:format) api/auth/registrations#update DELETE /api/auth(.:format) api/auth/registrations#destroy POST /api/auth(.:format) api/auth/registrations#create api_auth_validate_token GET /api/auth/validate_token(.:format) devise_token_auth/token_validations#validate_token api_auth_sessions GET /api/auth/sessions(.:format) api/auth/sessions#index rails_postmark_inbound_emails POST /rails/action_mailbox/postmark/inbound_emails(.:format) action_mailbox/ingresses/postmark/inbound_emails#create rails_relay_inbound_emails POST /rails/action_mailbox/relay/inbound_emails(.:format) action_mailbox/ingresses/relay/inbound_emails#create rails_sendgrid_inbound_emails POST /rails/action_mailbox/sendgrid/inbound_emails(.:format) action_mailbox/ingresses/sendgrid/inbound_emails#create rails_mandrill_inbound_health_check GET /rails/action_mailbox/mandrill/inbound_emails(.:format) action_mailbox/ingresses/mandrill/inbound_emails#health_check rails_mandrill_inbound_emails POST /rails/action_mailbox/mandrill/inbound_emails(.:format) action_mailbox/ingresses/mandrill/inbound_emails#create rails_mailgun_inbound_emails POST /rails/action_mailbox/mailgun/inbound_emails/mime(.:format) action_mailbox/ingresses/mailgun/inbound_emails#create rails_conductor_inbound_emails GET /rails/conductor/action_mailbox/inbound_emails(.:format) rails/conductor/action_mailbox/inbound_emails#index POST /rails/conductor/action_mailbox/inbound_emails(.:format) rails/conductor/action_mailbox/inbound_emails#create new_rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/new(.:format) rails/conductor/action_mailbox/inbound_emails#new rails_conductor_inbound_email GET /rails/conductor/action_mailbox/inbound_emails/:id(.:format) rails/conductor/action_mailbox/inbound_emails#show new_rails_conductor_inbound_email_source GET /rails/conductor/action_mailbox/inbound_emails/sources/new(.:format) rails/conductor/action_mailbox/inbound_emails/sources#new rails_conductor_inbound_email_sources POST /rails/conductor/action_mailbox/inbound_emails/sources(.:format) rails/conductor/action_mailbox/inbound_emails/sources#create rails_conductor_inbound_email_reroute POST /rails/conductor/action_mailbox/:inbound_email_id/reroute(.:format) rails/conductor/action_mailbox/reroutes#create rails_conductor_inbound_email_incinerate POST /rails/conductor/action_mailbox/:inbound_email_id/incinerate(.:format) rails/conductor/action_mailbox/incinerates#create 文字数の関係で少しだけ省略しています

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

デフォルトでは、registrations_controller.rb は、

registrations_controller.rb

1class Api::Auth::RegistrationsController < ApplicationController 2end

のようになっていました。その時は、404エラーではなく、

errors

1{"status":500," 2 error":"Internal Server Error", 3 "exception":"#\u003cNoMethodError: undefined method `devise' for class User, 4(以下略) 5}

のようになっていました。

正直、何を頼りにアイデアを探せば良いかわかりません。
どなたか、お力添えを頂けますと幸いです。

補足

ruby:3.3.1
rails: 7.1.3.2

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

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

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

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

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

guest

回答1

0

自己解決

何が原因なのか全くわかりませんでしたが、エラーが変わりました
DeviseTokenAuth::RegistrationsController を継承しているので、そちらの create アクションに飛んでいるはずだが、ルーティングがマッチしないとのことだったので、
app/controllers/api/auth/registrations_controller.rb に、
def create
end
の空のメソッドを追加 → curl → 別のエラー → 空のcreateアクションを消す
としたら、今度は Internal server error: verify_authenticity_token has not been defined というエラーになりました。なぜ?

これを無視するコードは、application_controller.rb に書いていますが、これを継承していないのが問題だと思い、registrations_controller.rb にも同じく skip_before_token :verify_authenticity_token を追加しましたが、
同じエラーでした

その後、また訳がわからないのですが、今度はこの skip_before_token をコメントアウトしてもう一度実行すると、なぜかまたエラーが変わりました泣

なぜか NoMethodErrorは解消し、データが送れたっぽくて
今度は、email can't be blank と言われました
小さいアプリなので、もともとメール認証は面倒だしスキップしようと思っていたので params_permit() に、emailをのぞいていましたから、これが原因になっていました
→ 追加したら、今度は
NoMethodErrorの、`downcase' for nil でエラーが起きました downcaseは組み込みメソッドだと思いますから、これを呼んでいる部分が nil になっているのが問題なようです
docker logs api から、rails serverのログを見ても、SQL文はすべて正常に行われたあと、curlリクエストのレスポンスとしての文字列表示に、整形のため使われている部分のdowncaseが問題になっていました。

devise_token_auth を git clone して、downcaseの該当部分を調べていると、、、
結局よくわからず、元gemの deviseで問題が起きている可能性も見え、原因療法としての真相究明は諦めました
ただ、github の issue に同じく downcase の問題が発生・解決しているものがありました。そちらをみると、
initializer/devise_token_auth.rb の、 config.headers_name の欄に、
:'authorization' => ‘authorization' を追加したら、正常にcurlリクエストが通り、status: success で返ってきました。

結論、よくわからないエラーの入れ替わりがたくさんあり、全く学習になった気がしませんが、とりあえずエラーが解決してしまったので、これはここで一旦閉じます。こういう対症療法の繰り返しは力になりませんから、避けたいところです。。。かなしい。

自己解決ですし、特定のgemの話で興味がある人も少ないようでしたから、回答の整形は全く行っておらず、読みづらい形になってしまいました。読んでくれた方がいらっしゃったら申し訳ございません。

以上、解決したので閉じとします

投稿2024/06/12 02:39

編集2024/06/12 02:43
inoda

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問