Rails引擎:只有辅助函数在重新启动服务器时才会重新加载

12

我目前正在尝试将功能移入引擎。到目前为止,它运作得很好,但是我有点困惑为什么引擎的某些部分在更改时会自动重新加载,而另一些则不会。

具体来说,在添加帮助程序方法时,我必须重新启动Rails服务器,否则Rails将无法看到它。这是正常行为吗?这是我的引擎的相关部分:

components/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

我对引擎还非常陌生,上面的很多代码都是我从别人的作品中借鉴来的,请耐心等待。任何指向正确方向的提示都将不胜感激。


1
https://dev59.com/BW445IYBdhLWcg3wwc2g - apneadiving
为什么你的代码放在“components”目录下?是什么促使你这样做?组件是Rails(1.2)的一个古老特性。 - Ryan Bigg
你会把它放在哪里?就像我说的,我拿了别人的代码,我认为因为在app/components中,东西得到了适当的重新加载。如果你正在开发一个引擎,你会把它放在哪里? - Joshua Muheim
3
引擎通常放置在 vendor/engines 目录下,它应该会自动加载。请参考(文档)[http://guides.rubyonrails.org/engines.html] 了解如何开始使用引擎。 - leenasn
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


如果您使用模块符号,并且您的引擎有自己的ApplicationController,则应该使用::ApplicationController.helper(IqListHelper) - Sebastian vom Meer

1
看起来你可能在处理引擎方面走了弯路。如果你只是想实现关注点分离,那么你可能只需要创建一些普通的 Ruby 类并将它们放在“lib/”目录下(当然要有组织地放)。
引擎应该是与你“当前”项目分开开发,并通过 gem 引入。据我所知,包含的 gem 的更改会导致服务器重新启动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接