undefined method `authenticate_user! Api::PostsController in Devise / Rails 4
devise, ruby-on-rails
Solution
You get that error because of nesting devise within the `:api` namespace in your `routes.rb` file. Therefore, you should authenticate users in the following way:
class Api::PostsController < ApplicationController
before_action :authenticate_api_user!, only: [ :create ]
end
Problem
There is the following routes in my project: ``` root 'home#index' namespace :api, defaults: { format: :json } do devise_for :users, controllers: { sessions: "api/sessions" } resources :posts end ``` User model: ``` class User < ActiveRecord::Base has_many :posts, dependent: :destroy has_many :comments, dependent: :destroy validates :name, presence: true devise :database_authenticatable, :rememberable end ``` Session controller: ``` class Api::SessionsController < Devise::SessionsController def create @user = User.find_for_database_authentication(email: params[:user][:email]) if @user && @user.valid_password?(params[:user][:password]) sign_in(@user) else warden.custom_failure! @errors = [ 'Invalid email or password' ] render 'api/shared/errors', status: :unauthorized end end end ``` Application controller: ``` class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. #protect_from_forgery with: :exception end ``` At last my Post controller: ``` class Api::PostsController < ApplicationController before_action :authenticate_user!, only: [ :create ] def create current_user.posts.create!(post_params) end private def post_params params.require(:post).permit(:title, :content) end end ``` But when I try to create a new Post I get the following error: "undefined method `authenticate_user! Api::PostsController". If I delete it, I get the error about 'current_user' method. What's the trouble? How can I fix it? Thanks in advance!!!