12

我目前正在尝试将功能转移到引擎中。到目前为止它工作得很好,但我有点困惑为什么引擎的某些部分总是在发生变化时自动重新加载,而有些则没有。

具体来说,添加辅助方法时,我必须重启 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/helpers/iq_list_helper.rb

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

我对引擎还是很陌生,上面的很多代码都是我从别人的工作中得到的,所以请耐心等待。任何指向正确方向的提示都将受到高度赞赏。

4

2 回答 2

1

如果您需要在每次请求时重新加载引擎中的代码,则需要将其放在引擎初始化代码的 to_prepare 块中

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

to_prepare 块中的代码保证在生产中运行一次,每次在开发中运行。

请参阅 Rails 指南以及 此 Rails 引擎代码是什么意思:config.to_prepare &method(:activate).to_proc

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

于 2014-10-24T05:42:56.883 回答
1

看来您可能在使用 Engines 时发现错误的树。如果您想简单地实现关注点分离,您可能只想制作一些普通的旧 ruby​​ 类并将它们插入lib/(当然以有组织的方式)。

引擎将与您的“当前”项目分开开发,可能是通过 gem 引入的。包含的 gem 的更改将需要重新启动服务器 AFAIK。

于 2014-08-03T16:58:21.557 回答