Report abuse

app/controllers/application.rb


			
class ApplicationController < ActionController::Base
  include MagicRoutes

  magic_routes_for :event, :user
end

lib/magic_routes.rb


			
module MagicRoutes
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def magic_routes_for(child, parent)
      Builder.new(child, parent).add_into(self)
    end
  end

  class Builder
    def initialize(child, parent)
      @child, @parent = child.to_s, parent.to_s
    end
    attr_reader :child, :parent

    def add_into(klass)
      mod = Module.new
      klass.send(:include, mod)
      names.each do |name|
        mod.class_eval %Q{
          def #{name}(args = {})
            if args[:#{parent}_id].nil?
              send("all_#{name}", args)
            else
              send("#{parent}_#{name}", args)
            end
          end
        }
        klass.helper_method name
      end
    end

    def names
      returning([]) do |names|
        prefixes.map do |prefix|
          suffixes.each do |suffix|
            names << "#{prefix}_#{suffix}"
          end
        end
      end
    end

    def prefixes
      [child.pluralize, child, "new_#{child}", "edit_#{child}"]
    end

    def suffixes
      %w{url path}
    end
  end
end