如何将 Rails 视图助手提取到 gem 中?

Posted

技术标签:

【中文标题】如何将 Rails 视图助手提取到 gem 中?【英文标题】:How do I extract Rails view helpers into a gem? 【发布时间】:2011-08-13 01:39:44 【问题描述】:

我有一组我经常使用的 rails 视图助手,并且想将它们打包到一个 gem 中,这样我就可以在我的 Gemfile 中放一行,并让助手可以从我的视图中访问。

我在使用 Bundler 和 Jeweler 之前创建了 gem,但是,我并不完全清楚如何在 gem 中组织 Rails 视图助手,并将它们包含到 rails 中。

我将不胜感激有关如何为 Rails 3 执行此操作的最新教程或链接

谢谢

澄清一下:问题不在于“如何创建宝石”。它的“如何在 gem 中打包视图助手,以便我可以在 Rails 中使用它们”

编辑 2: 我也同意下面的海报。对于这种(希望是简单的)要求,rails 引擎太过分了

【问题讨论】:

【参考方案1】:

在我看来,完整的Engine 对于这项任务来说太过分了。您可以改为创建一个 Railtie,它在初始化时将您的助手包含到 ActionView::Base 中。

# lib/my_gem/view_helpers.rb
module MyGem
  module ViewHelpers
    def pre(text)
      content_tag :pre, text
    end

    def another_helper
      # super secret stuff
    end
  end
end

# lib/my_gem/railtie.rb
require 'my_gem/view_helpers'
module MyGem
  class Railtie < Rails::Railtie
    initializer "my_gem.view_helpers" do
      ActiveSupport.on_load(:action_view)  include MyGem::ViewHelpers 
    end
  end
end

# lib/my_gem.rb
require 'my_gem/railtie' if defined?(Rails)

【讨论】:

谢谢,我要试试这个.. 会回报的 您好,我想知道:为什么叫“Railtie”,“Railtie”是什么意思? @why 好吧,我不确定,但我认为这是因为它是具有将代码“绑定”到“Rails”中所必需的钩子的类 @why "Railties" 是固定火车铁轨的木板条,即将它们“绑”在一起。这只是在 RoR 中为符合“rails”主题的类似结构命名的一种可爱方式。 @BrandonTilley 如果我可以提供一个建议,那就是利用内置的负载挂钩功能,而不是在 ActionView::Base 上调用私有方法 include。从3.0.0 开始,Rails 就提供了惰性加载钩子作为 ActiveSupport 的一部分。因此,初始化块的替代代码看起来像ActiveSupport.on_load( :action_view ) include MyGem::ViewHelpers 【参考方案2】:

此外,如果您只想为 Rails3 版本包含帮助程序,您可以使用

# lib/my_gem.rb
require 'my_gem/railtie' if defined?(Rails::Railtie)

【讨论】:

【参考方案3】:

您可能正在寻找的是engine。引擎是包含 Rails 应用程序片段的 gem(实际上,rails 应用程序本身就是一个引擎。)

【讨论】:

以上是关于如何将 Rails 视图助手提取到 gem 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Rails的静态页面打包成ruby gem?

Rails 5 - 使用 Audited gem 查看更改

如何将 toastr-rails gem 添加到 Rails 6 项目?

如何将导入的gem中的vue组件加载到rails中的lib目录?

如何通过任意 erb 文件访问任意视图助手的方法?

如何在 Rails 中为现有模型添加自动完成标记?