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

nol*_*oli 54 gem rubygems ruby-on-rails actionview ruby-on-rails-3

我有一组经常使用的rails视图助手,并希望将它们打包成一个gem,这样我就可以在我的Gemfile中添加一行,并从我的视图中访问帮助器.

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

我将非常感谢任何指针,或链接到有关如何为Rails 3执行此操作的最新教程

谢谢

只是为了澄清:问题不在于"如何创造宝石".它的"如何在gem中打包视图助手,所以我可以在Rails中使用它们"

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

Mic*_*ley 90

在我看来,完整的引擎对于这项任务来说太过分了.你可以改为创建一个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
      ActionView::Base.send :include, ViewHelpers
    end
  end
end

# lib/my_gem.rb
require 'my_gem/railtie' if defined?(Rails)
Run Code Online (Sandbox Code Playgroud)

  • @BrandonTilley如果我可以提供一个建议,那就是利用内置的加载钩子功能而不是在`ActionView :: Base`上调用私有方法`include`.自[3.0.0](https://github.com/rails/rails/blob/v3.0.0/activesupport/lib/active_support/lazy_load_hooks.rb)以来,Rails一直提供延迟加载挂钩作为ActiveSupport的一部分.因此,初始化程序块的替代代码看起来像`ActiveSupport.on_load(:action_view){include MyGem :: ViewHelpers}` (5认同)
  • @why"Railties"是火车轨道固定到的木板条,即将它们"捆绑"在一起.这只是一种在RoR中命名类似构造的可爱方式,与"rails"主题保持一致. (3认同)

tim*_*sly 5

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

# lib/my_gem.rb
require 'my_gem/railtie' if defined?(Rails::Railtie)
Run Code Online (Sandbox Code Playgroud)