尝试在控制器中加载服务时Rails错误

时间:2017-07-07 17:01:32

标签: ruby-on-rails ruby-on-rails-5

我的控制器使用create方法定义如下。

class AtestController < BaseController
def create
    result = create_something(params)
    @connection = Bunny.new
    @connection.start
    @channel = @connection.create_channel
    bunny = RabbitPublisherService::RabbitPublisher.new(@channel,@connection) 
    render :json => trigger, :status => :created
  end
end

My Rabbit Publisher Service定义如下

module RabbitPublisherService
  class RabbitPublisher

    private
    attr_accessor :channel, :connection

    def initialize(channel, connection)
      puts "I reached here"
      @channel = channel
      @connection = connection
    end

    def publish(message)
      q    = @channel.queue("task_queue", :durable => true)
      q.publish(message, :persistent => true)
      puts "Message is Published..."
      sleep 1.0
      @connection.close
    end
  end
end

当我尝试从控制器创建方法,RabbitPublisherService :: RabbitPublisher.new调用此服务时,我得到一个未初始化的常量错误说 :error_message =&gt;“未初始化的常量AtestController :: RabbitPublisherService”

有人可以帮我找出我做错了吗?

1 个答案:

答案 0 :(得分:1)

通常,这可能是您放置文件的位置以及Rails期望它们的位置的问题。可以在此处找到深入的指南:http://guides.rubyonrails.org/autoloading_and_reloading_constants.html

要解决这个问题,有三种选择:

  • 将Rails自动加载所需的模块和类放入其中(IMO这是首选解决方案)
  • 要求定义类的文件
  • 将包含该类的文件所在的文件夹添加到自动加载路径

1:您需要确保RabbitPublisherServiceRabbitPublisher位于Rails可以自动加载的位置,例如app/services/rabbit_publisher_service.rbapp/services/rabbit_publisher_service/rabbit_publisher.rb

2:使用require或(可能更好)require_relative

3:或者,您可以明确地将路径添加到自动加载/预加载路径。

在我看来,你应该坚持使用选项1,除非你有充分的理由不这样做。使用Rails&#39; defaults可以将代码保持在最低限度,并防止期望Rails默认值的开发人员出现意外情况。数字2也可以,因为它是明确的。我绝对会避免使用选项3,因为当你将大量文件放在意想不到的位置时,它总是会造成混乱,这使得习惯Rails默认并期望它们的其他开发人员更难。