2
votes

I use rails as backend for mobile app. I tried including versions for the Api. I use devise for authentication and now the authenticate_user! method is not working and it shows me the error

NoMethodError (undefined method `authenticate_user!' for
#<Api::V1::CategoryController:0x00000103b95088>)

I do not know where i am doing wrong. please help me resolve this problem. Any help is appreciated.

Update:

module Api
    module V1
class CategoryController < ApplicationController
    before_filter :authenticate_user!
2
I have the same problem, any solution by now?Bastien Beurier
Sorry. Still i could not find the solution and so left it undone. If you find something someday please let me know.logesh

2 Answers

3
votes

I had the same problem after versioning my API. It seems that Devise, after adding namespaces, Devise changes the authenticate_user! method to authenticate_api_v1_user! and also current_user to current_api_v1_user. That happens if you are namespacing like this:

namespace :api do
  namespace :v1 do
    devise_for :users do
      resources :sessions, defaults: {format: :json}
   end
  end
end

In order to solve the issue, you have to define devise_for first, before the namespacing. That way you will be able to access authenticate_user and current_user.

devise_for :users, :controllers => { :sessions => "api/v1/sessions" }
devise_scope :user do
  namespace :api do
    namespace :v1 do
      resources :sessions, defaults: {format: :json}
    end
  end
end
resources :users

I hope it helps!

0
votes

I think, authenticate_user! added to ApplicationController.

If your Api controller inherit from another controller (not ApplicationController), u need to include this helper to your Api controller manually.