我在文件AuthenticatorService
中有app/services/authenticator_service.rb
个模块。
此模块如下所示:
module AuthenticatorService
# authenticate user with its email and password
# in case of success, return signed in user
# otherwise, throw an exception
def authenticate_with_credentials(email, password)
user = User.find_by_email(email)
raise "Invalid email or password" if user.nil? or not user.authenticate password
return user
end
# some other methods...
end
我目前在SessionsController
。
class V1::SessionsController < ApplicationController
# POST /sessions
# if the credentials are valid, sign in the user and return the auth token
# otherwise, return json data containing the error
def sign_in
begin
user = AuthenticatorService.authenticate_with_credentials params[:email], params[:password]
token = AuthenticatorService::generate_token user
render json: { success: true, user: user.as_json(only: [:id, :first_name, :last_name, :email]), token: token }
rescue Exception => e
render json: { success: false, message: e.message }, status: 401
end
end
end
SessionsController
位于名称空间V1
中,因为它位于app/controllers/v1/sessions_controller.rb
,但这不是问题所在。
问题在于,当我调用与SessionsController::sign_in
对应的路线时,出现以下错误:undefined method 'authenticate_with_credentials' for AuthenticatorService:Module
。
我无法理解为什么在开发和生产环境中出现这种错误的原因有多种:
authenticate_with_credentials
中列出了puts AuthenticatorService.public_instance_methods
也许有人可以给我一些帮助。
答案 0 :(得分:1)
要解决您的问题,请添加
module_function :authenticate_with_credentials
AuthenticatorService
模块中的
声明。
AuthenticatorService.public_instance_methods
包含此方法,因为包含此模块的实例将使用此方法。但是AuthenticatorService
本身不是一个实例。