我的控制器使用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”
有人可以帮我找出我做错了吗?
答案 0 :(得分:1)
通常,这可能是您放置文件的位置以及Rails期望它们的位置的问题。可以在此处找到深入的指南:http://guides.rubyonrails.org/autoloading_and_reloading_constants.html。
要解决这个问题,有三种选择:
1:您需要确保RabbitPublisherService
和RabbitPublisher
位于Rails可以自动加载的位置,例如app/services/rabbit_publisher_service.rb
和app/services/rabbit_publisher_service/rabbit_publisher.rb
。
2:使用require
或(可能更好)require_relative
。
3:或者,您可以明确地将路径添加到自动加载/预加载路径。
在我看来,你应该坚持使用选项1,除非你有充分的理由不这样做。使用Rails&#39; defaults可以将代码保持在最低限度,并防止期望Rails默认值的开发人员出现意外情况。数字2也可以,因为它是明确的。我绝对会避免使用选项3,因为当你将大量文件放在意想不到的位置时,它总是会造成混乱,这使得习惯Rails默认并期望它们的其他开发人员更难。