How do I extract Rails view helpers into a gem?

Ruby on-RailsRuby on-Rails-3RubygemsGemActionview

Ruby on-Rails Problem Overview


I have a set of rails view helpers that I use regularly, and would like to package them up into a gem, such that I could just put a line in my Gemfile, and have the helpers accessible from my views.

I have created gems before using Bundler, and Jeweler, however, I'm not all all clear on how to organize the Rails view helpers in a gem, and include them into rails.

I would appreciate any pointers, or links to up-to-date tutorials on how to do this for Rails 3

Thanks

Just to clarify: The question isn't on "how to create a gem". Its "how to package view helpers in a gem, so I can use them in Rails"

Edit 2: I also agree with the poster below.. A rails engine is waay too much overkill for this kind of (hopefully simple) requirement

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

In my opinion, a full Engine is overkill for this task. You could instead just create a Railtie which includes your helpers into ActionView::Base when it initializes.

# 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)

Solution 2 - Ruby on-Rails

Also if you want include helper only for Rails3 version you can use

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

Solution 3 - Ruby on-Rails

What you are probably looking for is an engine. An engine is a gem that contains rails application pieces (in fact, a rails application is itself an engine.)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnoliView Question on Stackoverflow
Solution 1 - Ruby on-RailsMichelle TilleyView Answer on Stackoverflow
Solution 2 - Ruby on-RailstimfjordView Answer on Stackoverflow
Solution 3 - Ruby on-RailsMarioView Answer on Stackoverflow