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