Rails Engines: Помощники перезагружаются только при перезапуске сервера.

В настоящее время я экспериментирую с движущимися функциями в двигателях. Он работает до сих пор хорошо, но я немного смущен, почему некоторые части двигателя всегда автоматически перезагружаются, когда что-то меняется, а некоторые нет.

В частности, при добавлении вспомогательного метода мне необходимо перезапустить сервер Rails, иначе он не будет отображаться Rails. Это нормальное поведение? Вот соответствующая часть моего движка:

компоненты/iq_list.rb

# encoding: utf-8
require 'iq_list/engine'

# Load IqList Modules
module IqList
  extend ActiveSupport::Autoload
  autoload :Helpers
  autoload :Models
  autoload :Controllers
end

компоненты/iq_list/engine.rb

module IqList
  class Engine < ::Rails::Engine
  end
end

компоненты/iq_list/helpers.rb

module IqList
  module Helpers
    extend ActiveSupport::Autoload
    autoload :IqListHelper
  end
end

компоненты/iq_list/хелперы/iq_list_helper.rb

module IqList
  module Helpers
    module IqListHelper
      def some_method
        # ...
      end
    end
  end
end

Я все еще очень новичок в машинах, и много кода выше, я взял от кого-то другого, поэтому, пожалуйста, будьте терпеливы со мной. Любой намек в правильном направлении высоко ценится.

Ответ 1

Похоже, что вы можете лаять неправильное дерево с помощью двигателей. Если вы пытаетесь просто добиться разделения проблем, вы, вероятно, просто хотите сделать несколько простых старых классов рубинов и вставить их в lib/ (организованным образом, конечно).

Двигатель будет разрабатываться отдельно от вашего "текущего" проекта, вероятно, с помощью драгоценного камня. Изменения в включенных драгоценных камнях потребуют перезапуска вашего сервера AFAIK.

Ответ 2

Если вам нужен код из вашего двигателя, перезагруженный при каждом запросе, вам нужно поместить его в блок to_prepare кода инициализации движка

module IqList
  class Engine < ::Rails::Engine
    config.to_prepare do
     ApplicationController.helper(IqListHelper)
    end
  end
end

Код в блоке to_prepare гарантированно запускается один раз в процессе производства и каждый раз в разработке.

см. направляющие направляющих, а также Что означает этот код Rails Engine: config.to_prepare & method (: activate).to_proc

и

http://robots.thoughtbot.com/tips-for-writing-your-own-rails-engine