我目前正在尝试将功能转移到引擎中。到目前为止它运行良好,但我有点困惑为什么引擎的某些部分总是在发生变化时自动重新加载,而有些部分则没有。
具体来说,在添加帮助器方法时,我必须重新启动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
我对引擎还很陌生,上面的很多代码都取自别人的工作,所以请耐心等待我。任何暗示正确的方向都受到高度赞赏。
答案 0 :(得分:1)
看起来你可能正在用Engines咆哮错误的树。如果你想简单地实现关注点分离,你可能只想制作一些普通的旧ruby类并将它们粘贴在lib/
中(当然是以有组织的方式)。
引擎将与您的“当前”项目分开开发,可能是通过宝石引入的。包含宝石的更改将需要重新启动服务器AFAIK。
答案 1 :(得分:1)
如果您需要在每次请求时重新加载引擎中的代码,则需要将其放在引擎初始化代码的to_prepare块中
module IqList
class Engine < ::Rails::Engine
config.to_prepare do
ApplicationController.helper(IqListHelper)
end
end
end
to_prepare块中的代码保证在生产中运行一次,每次都在开发中。
请参阅导轨指南以及 What does this Rails Engine code mean: config.to_prepare &method(:activate).to_proc
和
http://robots.thoughtbot.com/tips-for-writing-your-own-rails-engine