Skip to content

Instantly share code, notes, and snippets.

@tylergannon
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tylergannon/0b63979299f8f031e7e8 to your computer and use it in GitHub Desktop.
Save tylergannon/0b63979299f8f031e7e8 to your computer and use it in GitHub Desktop.
Create route helpers for your controllers. Helpful for nested controllers.
module RouteHelpers
extend ActiveSupport::Concern
module ClassMethods
def create_resource_helpers(*params)
@resource_params = params
@resource_classes = params.select{|t| t.kind_of?(Class)}
define_resource
define_resource_class
define_resource_params
define_resource_path
define_collection_path
define_new_resource_path
define_edit_resource_path
helper_method :resource, :resource_class, :resource_params
helper_method :resource_path, :collection_path, :new_resource_path, :edit_resource_path
if @resource_classes.size >= 2
define_parent_class
define_parent
define_parent_path
helper_method :parent_class, :parent, :parent_path
end
end
def set_resource_params(parms)
@resource_params = parms
end
def define_resource_params
params = @resource_params.map{|t| t.kind_of?(Symbol) ? t.inspect : "@#{t.name.underscore}"}
class_eval "
def resource_params
[#{params.join(', ')}]
end
"
end
def define_resource
class_eval "
def resource
@#{@resource_classes[-1].name.underscore}
end
"
end
def define_resource_class
class_eval "
def resource_class
#{@resource_classes[-1]}
end
"
end
def define_parent_class
class_eval "
def parent_class
#{@resource_classes[-2]}
end
"
end
def define_parent
class_eval "
def parent
@#{@resource_classes[-2].name.underscore}
end
"
end
def define_parent_path
@params = @resource_params.dup
@params.pop
@params.pop if @params.last.kind_of?(Symbol)
class_eval "
def parent_path(params={})
#{@params.map{|t| t.to_s.underscore}.join('_')}_path(parent, params)
end
"
end
def define_collection_path
@params = @resource_params.dup
# @params.pop
# @params.pop if @params.last.kind_of?(Symbol)
class_eval "
def collection_path(params={})
#{@params.map{|t| t.to_s.underscore}.join('_')}_path(parent, params)
end
"
end
def define_resource_path
@params = @resource_params.dup
method_name = "#{@params.map{|t| t.to_s.underscore}.join('_')}_path"
class_eval "
def resource_path(*args)
if args[0].kind_of?(resource_class)
#{method_name}(parent, args[0], args[1])
else
#{method_name}(parent, resource, args[0])
end
end
"
end
def define_edit_resource_path
@params = @resource_params.dup
method_name = "edit_#{@params.map{|t| t.to_s.underscore}.join('_')}_path"
class_eval "
def edit_resource_path(*args)
if args[0].kind_of?(resource_class)
#{method_name}(parent, args[0], args[1])
else
#{method_name}(parent, resource, args[0])
end
end
"
end
def define_new_resource_path
@params = @resource_params.dup
class_eval "
def new_resource_path(params={})
new_#{@params.map{|t| t.to_s.underscore}.join('_')}_path(parent, resource, params)
end
"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment