2014-11-27 3 views
8

Существует следующие маршруты в моем проекте:undefined method `authenticate_user! Api :: PostsController в Devise/Rails 4

root 'home#index' 

    namespace :api, defaults: { format: :json } do 
    devise_for :users, controllers: { sessions: "api/sessions" } 
    resources :posts 
    end 

модель Пользователь:

class User < ActiveRecord::Base 
    has_many :posts,  dependent: :destroy 
    has_many :comments, dependent: :destroy 

    validates :name, presence: true 

    devise :database_authenticatable, :rememberable 
end 

контроллер Session:

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 

Применение контроллера:

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 

Наконец мой пост контроллер:

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 

Но когда я пытаюсь создать новый пост я получаю следующее сообщение об ошибке: «неопределенный метод` authenticate_user! Api :: PostsController ".Если я его удалю, я получаю сообщение об ошибке« метод current_user ». В чем проблема? Как я могу исправить это? Спасибо заранее!

+0

Попробуйте удалить! –

ответ

3

У меня была аналогичная проблема с использованием dev. проблема в том, что я назвал свою БД с другим именем, а не пользователь (я назвал xuser). в моем случае все я должен был сделать переименовывать ВАР в мой контроллер. что-то вроде этого

before_action :authenticate_xuser!, only: [ :create ] 

def create 
    current_xuser.posts.create!(post_params) 
end 

private 

def post_params 
     params.require(:post).permit(:title, :content) 
end 

Надежда это помогает!

12

Вы получаете эту ошибку из-за гнездования в пределах :api namespac e в вашем файле routes.rb. Поэтому вы должны аутентифицировать пользователей следующим образом:

class Api::PostsController < ApplicationController 
    before_action :authenticate_api_user!, only: [ :create ] 
end 
+1

Это очень странный образец! – mekdigital

Смежные вопросы