Edited at

[Rails] undefined method authenticate_user!の対処方法

More than 1 year has passed since last update.


概要

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!が定義されていません。のメッセージが返却される。


response

{

"status": "error",
"message": "undefined method `authenticate_user!' for #<Api::DummysController:0x0000000000000000>"
}


RoutesとController

名前空間apiにmount_devise_token_auth_forを所属させているのが特徴である。


routes.rb

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


DummysController.rb

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


DummysController.rb

class Api::DummysController < ApplicationController

before_action :authenticate_api_user! # 変更点

# 省略
end



補足

authenticate_userだけではなく、current_userも同様の仕組みとなっているため、

current_userをcurrent_api_userに変更する必要がある。


参考文献

https://github.com/lynndylanhurley/devise_token_auth/issues/182