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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With