---
title: Rails plugins
category: Rails
---

Generate a plugin
-----------------

Generate a Rails Engine plugin:

    rails plugin new myplugin --skip-bundle --full

Initializers
------------

* [Rails::Railtie](http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html)
* [EngineYard blog 
  post](http://www.engineyard.com/blog/2010/extending-rails-3-with-railties/)

Subclass Railtie and provide an `initializer` method.

    module NewPlugin
      class Railtie < Rails::Railtie
        initializer "newplugin.initialize" do |app|
     
          # subscribe to all rails notifications: controllers, AR, etc.
          ActiveSupport::Notifications.subscribe do |*args|
            event = ActiveSupport::Notifications::Event.new(*args)
            puts "Got notification: #{event.inspect}"
          end
     
        end
      end
    end
     
Custom routes
-------------

* [ActionDispatch::Routing::Mapper](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper.html)

To create custom `routes.rb` keywords:

    # # routes.rb:
    # myplugin_for x
    #
    class ActionDispatch::Routing
      class Mapper
        def myplugin_for(*x)
        end
      end
    end

Example with a block:

    # authenticated do
    #   resources :users
    # end
    #
    def authenticated
      constraint = lambda { |request| request... }

      constraints(constraint) { yield }
    end

Custom generators
-----------------

* [Guide: generators](http://guides.rubyonrails.org/generators.html)
* [ActiveRecord::Generators::Base](http://api.rubyonrails.org/classes/ActiveRecord/Generators/Base.html)

### Basic

    # rails g initializer
    # lib/generators/initializer_generator.rb
    class InitializerGenerator < Rails::Generators::Base
      def create_initializer_file
        create_file "config/initializers/initializer.rb", "# Add initialization content here"
      end
    end

 * Extend `Rails::Generators::Base`.
 * Each public method in the generator is executed when a generator is invoked. 

### Generating a generator
 
    $ rails generate generator initializer

### NamedBase

Use `NamedBase` instead if you want to take an argument. It will be available as 
`file_name`.

    class InitializerGenerator < Rails::Generators::Base
      def lol
        puts file_name
      end
    end

### More

    class InitializerGenerator < Rails::Generators::NamedBase
      # 
      source_root File.expand_path("../templates", __FILE__)
      desc "Description goes here."
    end

### Generators lookup
  
When invoking `rails g XXX`:

    [rails/]generators/XXX/XXX_generator.rb
    [rails/]generators/XXX_generator.rb

When invoking `rails g XXX:YYY`:

    [rails/]generators/XXX/YYY_generator.rb

ActiveModel 'acts as'
---------------------

    # yaffle/lib/yaffle/acts_as_yaffle.rb
    module Yaffle
      module ActsAsYaffle
        extend ActiveSupport::Concern
     
        included do
        end
     
        module ClassMethods
          def acts_as_yaffle(options = {})
            # your code will go here
          end
        end
      end
    end
     
    ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle

