2017-07-07 4 views
0

私のコントローラは、createメソッドで次のように定義されています。コントローラでサービスをロードしようとしたときにRailsエラーが発生しました

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 

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"

私が間違っていることを誰かに教えてもらえますか?

+0

「include RabbitPublisherService」をコントローラに追加してみてください – Pavan

答えて

1

一般的に、これはファイルを置いた場所やRailsが期待する場所に問題がある可能性があります。詳しくは、http://guides.rubyonrails.org/autoloading_and_reloading_constants.htmlをご覧ください。

は、3つのオプションがあり、それを解決するために:

  • はRailsのオートローディングがそれらを期待するモジュールとクラスを置く
  • は、クラスが定義されているファイルを必要とする(IMOこれは好ましい解決策はある)
  • あなたは確か RabbitPublisherServiceとことを確認する必要があります。
  • は、クラスを含むファイルを自動ロードパス

1に置かれているフォルダを追加します10は、Railsが自動ロードできる場所にあります。たとえば、app/services/rabbit_publisher_service.rbapp/services/rabbit_publisher_service/rabbit_publisher.rbです。

2:requireまたは(おそらく良い)require_relativeを使用してください。

3また、自動ロード/ eagerロードパスにパスを明示的に追加することもできます。

私の意見では、非常に正当な理由がない限り、オプション1に固執すべきです。 Railsのデフォルトを使用するとコードが最小限に抑えられ、Railsのデフォルトを期待している同僚の開発者にとっては驚きを防ぐことができます。それは明示的なので、数字2もOKです。私は間違いなく、予期しない場所にたくさんのファイルを置くと、遅かれ早かれ、いつも混乱を招き、Railsのデフォルトに慣れていて、それらを期待している他の開発者にとっては難しくなりますので、オプション3は避けてください。

関連する問題