尝试在控制器中加载服务时出现Rails错误 [英] Rails error while trying to load a Service in a controller
本文介绍了尝试在控制器中加载服务时出现Rails错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的控制器使用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服务定义如下
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=>"未初始化常量AtestController::RabbitPublisherService"
有人能帮我找出我做错了什么吗?
推荐答案
通常,这可能是您放置文件的位置以及Rails期望它们的位置的问题。详细指南可在此处找到:http://guides.rubyonrails.org/autoloading_and_reloading_constants.html。
要解决此问题,有三个选项:
- 将模块和类放在Rails自动加载需要它们的位置(IMO这是首选解决方案)
- 需要定义类的文件
- 将包含类的文件所在的文件夹添加到自动加载路径
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的默认设置可以将代码保持在最少,并防止期望使用Rails默认设置的其他开发人员感到意外。数字2也可以,因为它是明确的。我绝对会避免选择3,因为当您将大量文件放在意外位置时,它迟早会造成混乱,并且会使习惯了Rails默认设置并期待它们的其他开发人员更加困难。
这篇关于尝试在控制器中加载服务时出现Rails错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文