2015-04-20 43 views
1

我正在爲待辦事項列表編寫簡單的Ruby API。以下是我迄今爲止:在JSON中顯示未定義的方法錯誤

API控制器:

class ApiController < ApplicationController 
    skip_before_action :verify_authenticity_token 

    private 

    def authenticated? 
    authenticate_or_request_with_http_basic {|username, password| User.where(username: username, password: password).present? } 
    end 

end 

API/USERS_CONTROLLER:

class Api::UsersController < ApplicationController 

    before_action :authenticated? 

    def index 
    users = User.all 
    render json: users, each_serializer: UserSerializer 
    end 

end 

途徑:

Rails.application.routes.draw do 
namespace :api, defaults: { format: :json } do 
resources :users 
end 

resources :welcome, only: [:index] 

root 'welcome#index' 
end 

當我嘗試導航到api_users_path ,它帶來了錯誤:

undefined method `authenticated?' for # Api::UsersController:0x007f36a3f779f8 

我敢肯定,有一些簡單的我錯過了,有人可以指出我在正確的方向嗎?

+0

歡迎堆棧溢出。考慮將SO問題作爲如何解決常見編程問題的參考書中的條目。在參考書中,我們不使用稱呼(「嗨!」)或虛詞(「謝謝!」)或簽名(「弗雷德」)。換句話說,SO不是公告板或聊天,而是一個問答,我們重視準確性,並且簡潔。 –

回答

2

要發佈authenticated?方法你Api::UsersController,在application_controller.rb改變privateprotected

class ApiController < ApplicationController 
    skip_before_action :verify_authenticity_token 

    protected 

    def authenticated? 
    authenticate_or_request_with_http_basic {|username, password| User.where(username: username, password: password).present? } 
    end 

end 

更改爲protected將可用的方法ApplicationController和它的所有子類。如果它設置爲private,則該方法僅可用於ApplicationController本身。

你也應該確保從ApiControllerApi::UsersController繼承:

class Api::UsersController < ApiController 
... 
end 
+0

就像我之前說的。 :) – dx7

+0

謝謝@infused –

1

方法authenticated?定義於ApiControllerApi::UsersController無法訪問此方法。要在所有控制器上使用它,您可以在ApplicationController上定義此方法爲受保護方法。