尝试在控制器中加载服务时出现Rails错误 [英] Rails error while trying to load a Service in a controller

查看:19
本文介绍了尝试在控制器中加载服务时出现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:您需要确保RabbitPublisherServiceRabbitPublisher位于Rails可以自动加载它们的位置,例如app/services/rabbit_publisher_service.rbapp/services/rabbit_publisher_service/rabbit_publisher.rb

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

3:或者,您也可以显式将路径添加到自动加载/急切加载路径。

在我看来,您应该坚持选项1,除非您有非常好的理由不这样做。使用Rails的默认设置可以将代码保持在最少,并防止期望使用Rails默认设置的其他开发人员感到意外。数字2也可以,因为它是明确的。我绝对会避免选择3,因为当您将大量文件放在意外位置时,它迟早会造成混乱,并且会使习惯了Rails默认设置并期待它们的其他开发人员更加困难。

这篇关于尝试在控制器中加载服务时出现Rails错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆