【问题标题】:Rails error while trying to load a Service in a controller尝试在控制器中加载服务时出现 Rails 错误
【发布时间】:2017-07-08 01:22:00
【问题描述】:

我的控制器用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=>"未初始化的常量 AtestController::RabbitPublisherService"

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

【问题讨论】:

  • 尝试将include RabbitPublisherService添加到控制器

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


【解决方案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 的默认值可以将代码保持在最低限度,并防止那些期望使用 Rails 默认值的开发人员感到意外。数字 2 也可以,因为它是明确的。我肯定会避免使用选项 3,因为当您将大量文件放在意想不到的位置时,它迟早总是会造成混乱,并且对于习惯于 Rails 默认值并期望它们的其他开发人员来说,它会变得更加困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多