Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rendering a view from my Ruby on Rails Gem

I created a simple Gem for Ruby on Rails; the idea is that it provides some code/views for common actions (index/show/etc.) that I use in several of my applications. I would like to "DRY it up" in a Gem.

Creating the Concern went without problems, however, I can't quite seem to manage to render a view in my application.

For example, in my lib/rails_default_actions/rails_default_actions.rb I do:

module RailsDefaultActions
  module DefaultActions
    extend ActiveSupport::Concern
      respond_to do |format|
        format.html { render 'default/index' }
      end
    end
  end
end

But an error is raised:

Missing template default/index with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim, :haml]}. Searched in:
  * "/home/martin/myapp/app/views"
  * "/home/martin/myapp/vendor/bundle/ruby/2.1.0/gems/devise-3.2.4/app/views"
  * "/home/martin/myapp"

I eventually sort of managed to hack my way around this error, but it feels very kludgey and doesn't work in some scenarios. What is the correct way to include views in a gem?

I looked at creating an Engine, but that seems like overkill, since I just have a concern and a few views.

like image 297
Martin Tournoij Avatar asked Jun 16 '14 16:06

Martin Tournoij


People also ask

Is Ruby on Rails a gem?

Ruby on Rails gems are libraries which allow any developer to add new functionalities without writing code - they're like plugins, and they're available for almost every function you could name, from payment processing tools to authentication.


1 Answers

The "correct" way to do this since Rails 3 is to create an Engine; there's also a Rails guide for this, but creating a basic engine is as easy as:

module MyGemName
  class Engine < Rails::Engine
  end
end

When Rails looks for a view to render, it will first look in the app/views directory of the application. If it cannot find the view there, it will check in the app/views directories of all engines that have this directory.

like image 116
Eduardo Avatar answered Oct 05 '22 23:10

Eduardo