Rails:模块

时间:2015-09-26 20:16:26

标签: ruby-on-rails ruby ruby-on-rails-4 controller

我在文件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

我无法理解为什么在开发和生产环境中出现这种错误的原因有多种:

  • 当我添加调试信息时,我可以看到AuthenticatorService已加载并可从控制器访问
  • 此外,当我显示公共实例方法时,authenticate_with_credentials中列出了puts AuthenticatorService.public_instance_methods
  • 在我的测试中,此控制器已经过测试,一切都按预期工作......

也许有人可以给我一些帮助。

1 个答案:

答案 0 :(得分:1)

要解决您的问题,请添加

module_function :authenticate_with_credentials

AuthenticatorService模块中的

声明。

AuthenticatorService.public_instance_methods包含此方法,因为包含此模块的实例将使用此方法。但是AuthenticatorService本身不是一个实例。