Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add a Rails controller from a gem

I am developing a rubygem specifically for Rails applications and I want to add a controller from my gem so that it will be available on the Rails app(Similar to what devise does with RegistrationsController, SessionsController).

On the gem side:

I've tried adding the following app/controllers/samples_controller.rb

class SamplesController < ApplicationController
  def index
    .
    .
  end
end

And then on my rails routes add it either as:

match 'route' => 'samples#index'

or

resources :samples

Clearly I got something wrong over there but I have no idea what is it? Do I need to explicitly require my SampleController somewhere or an initializer on the app?

Right now I am getting this error when accessing the route

uninitialized constant SamplesController

Thanks :)

like image 364
rogeliog Avatar asked Jun 02 '12 11:06

rogeliog


1 Answers

Let's assume your gem is called MyGem and you have a controller called SamplesController that you want to use in the app. Your controller should be defined as:

module MyGem
  class SamplesController < ApplicationController
    def whatever
      ...
    end
  end
end

and in your gem directory it should live at app/controllers/my_gem/samples_controller.rb (not under the lib folder).

Then create engine.rb in your gems lib/my_gem folder with code

module MyGem
  class Engine < Rails::Engine; end
end

You can write routes inside your gem by writing creating routes.rb in config folder with code

# my_gem/config/routes.rb
Rails.application.routes.draw do
  match 'route' => 'my_gem/samples#index'
end

Final structure something like this

## DIRECTORY STRUCTURE
#

- my_gem/
  - app/
    - controllers/
      - my_gem/
        + samples_controller.rb
  - config/
    + routes.rb
  - lib/
    - my_gem.rb
    - my_gem/
      + engine.rb
      + version.rb
  + my_gem.gemspec
  + Gemfile
  + Gemfile.lock

Thats it.

like image 169
Ketan Ghumatkar Avatar answered Oct 02 '22 21:10

Ketan Ghumatkar