【问题标题】:Rails Engines: Helpers only are reloaded when restarting the serverRails 引擎:仅在重新启动服务器时重新加载助手
【发布时间】:2012-08-24 21:11:40
【问题描述】:

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

具体来说,添加helper方法的时候,必须重启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

components/iq_list/engine.rb

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

components/iq_list/helpers.rb

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

components/iq_list/helpers/iq_list_helper.rb

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

我对引擎还是很陌生,上面的很多代码都是我从别人的工作中提取的,所以请耐心等待。任何指向正确方向的提示都非常感谢。

【问题讨论】:

  • 为什么你的代码在components 目录下?是什么让你这样做?组件是 Rails (1.2) 的一个古老特性。
  • 你会把它放在哪里?如前所述,我从其他人那里获取了代码,我认为这是因为在app/components 内的东西正在正确地重新加载。您会在哪里放置您正在大力开发的引擎?
  • 引擎通常放在vendor/engines 目录下,应该会自动加载。请参考(文档)[guides.rubyonrails.org/engines.html] 了解如何开始使用引擎

标签: ruby-on-rails helper rails-engines


【解决方案1】:

看来您可能在使用引擎时找错了方向。如果您想简单地实现关注点分离,您可能只想制作一些普通的旧 ruby​​ 类并将它们粘贴在 lib/ 中(当然是以有组织的方式)。

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

【讨论】:

    【解决方案2】:

    如果您需要在每次请求时重新加载引擎中的代码,您需要将其放在引擎初始化代码的 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

    【讨论】:

    • 如果你使用模块符号并且你的引擎有它自己的ApplicationController,你应该改用::ApplicationController.helper(IqListHelper)
    猜你喜欢
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2010-11-10
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多