Rendering a view from my Ruby on Rails Gem

2020-06-18 12:25发布

问题:

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.

回答1:

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.