何时根据导轨加载Gem代码

我正在开发一个专门用于Rails项目的Gem。 它是在Rails应用程序的lib目录内部开发的,现在将在一个单独的Gem中提取。

有些类依赖于要加载的Rails框架。 两个例子:

class OurGem::Hookup
  CONFIG_PATH = 'config/hookup.rb'.freeze
  [...]
end

class OurGem::RoutingContainer
  include Rails.application.routes.url_helpers
  [...]
end

通常,我使用require在Gem的主模块文件中加载Gem代码。 但是,由于这是由bundler加载的,Rails还没有准备好, Rails.applicationRails.root等东西无法使用。 第一个例子可以通过在加载时不评估路径来解决,但第二个例子对我来说似乎有点棘手。

这样做的正确方法是什么? 使用railtie注册初始化程序并要求那里的“精巧”文件?


这是一个奇怪的设置,因为你的宝石取决于你的导轨应用程序,你的导轨应用程序取决于你的宝石。

这看起来太耦合了。 你有没有考虑创建一个自包含的导轨引擎,你的主要应用程序挂载,而不是?

不过,你也许能够做到这一点:

# Gemfile
gem 'our_gem', require: false

# config/initializers/our_gem.rb
require 'our_gem'
OurGem::Hookup.config_path = '...'

这可以确保你的gem只在rails应用程序初始化之后被加载 - 所以Rails.application.routes.url_helpers这样的东西将被定义。

链接地址: http://www.djcxy.com/p/81115.html

上一篇: When to load Gem code when depending on rails

下一篇: Extend a rails model in a gem