2014-11-27 10 views
8

C'è seguenti percorsi nel mio progetto:metodo non definito `authenticate_user! Api :: PostsController in Devise/Rails 4

root 'home#index' 

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

modello User:

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

    validates :name, presence: true 

    devise :database_authenticatable, :rememberable 
end 

regolatore Sessione:

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 

Applicazione del 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 

Finalmente il mio controller del messaggio:

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 

Ma quando cerco di creare un nuovo post ottengo il seguente errore: "metodo non definito` authenticate_user! Api :: PostsController ".Se lo elimino, ottengo l'errore sul metodo 'current_user' Qual è il problema? Come posso risolvere il problema? Grazie in anticipo !!!

+0

Provare a rimuovere il! –

risposta

3

Ho avuto un problema simile usando Idea. il problema era che ho chiamato il mio db con un nome diverso, piuttosto che utente (ho chiamato XUser). nel mio caso tutto quello che dovevo fare era rinominare i Vars nel mio controller. Qualcosa di simile

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 

Speranza aiuta!

12

Si ottiene questo errore a causa del nesting concepito all'interno del namespace :api e nel tuo file routes.rb. Pertanto, è necessario autenticare gli utenti nel seguente modo:

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

Questo è uno schema molto strano! – mekdigital