LoginSignup
26
19

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-10

概要

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に変更する必要がある。

参考文献

26
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
19