我正在为待办事项列表编写一个简单的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
我确信有一些简单的我想念,有人能指出我正确的方向吗?
答案 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
上将此方法定义为受保护。