概要
Ruby初心者が陥りやすい存在するはずの関数が見つからない状況になったときの対処方法について。
環境
- Ruby 2.5.1
- Ruby on Rails 5.2.1
- devise 4.4.3
- devise_token_auth 0.2.0
エラー
devise_token_authを利用しているため、json形式のレスポンスとなる。
レスポンスでauthenticate_user!
が定義されていません。のメッセージが返却される。
{
"status": "error",
"message": "undefined method `authenticate_user!' for #<Api::DummysController:0x0000000000000000>"
}
RoutesとController
名前空間apiにmount_devise_token_auth_forを所属させているのが特徴である。
Rails.application.routes.draw do
namespace :api do
mount_devise_token_auth_for 'User', at: 'auth', controllers: {
registrations: 'api/auth/registrations'
}
resources :dummys
end
end
class Api::DummysController < ApplicationController
before_action :authenticate_user! # ここでエラー
# 省略
end
原因
routes.rbの名前空間が原因でauthenticate_user!
の定義エラーが発生。
mount_devise_token_auth_forの内部で呼び出されるdevise_forを呼び出すと自動的にauthenticate_userを生成する仕組みとなっている。よって、自動的に作成した時の名前空間が通常と異なると生成されるauthenticate_userも名前空間に従った命名に変更される。
公式ドキュメントにも同じような記載があるので一度は確認しましょう。
対応
名前空間に対応した関数名に変更することで解消する。
- before :
authenticate_user
- after :
authenticate_api_user
class Api::DummysController < ApplicationController
before_action :authenticate_api_user! # 変更点
# 省略
end
補足
authenticate_userだけではなく、current_userも同様の仕組みとなっているため、
current_userをcurrent_api_userに変更する必要がある。
参考文献