在JSON中显示的未定义方法错误

时间:2015-04-20 19:56:29

标签: ruby-on-rails ruby json

我正在为待办事项列表编写一个简单的Ruby API。以下是我到目前为止的情况:

API CONTROLLER:

 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

我确信有一些简单的我想念,有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

要使authenticated?方法可用于Api::UsersController,请在private中将protected更改为application_controller.rb

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本身可用。

您还应该确保Api::UsersController继承自ApiController

class Api::UsersController < ApiController
...
end

答案 1 :(得分:1)

方法authenticated?ApiController上定义。 Api::UsersController无法访问此方法。要在所有控制器上使用它,您可以在ApplicationController上将此方法定义为受保护。