如何将 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 中?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 toastr-rails gem 添加到 Rails 6 项目?