-
-
Save tylergannon/0b63979299f8f031e7e8 to your computer and use it in GitHub Desktop.
Create route helpers for your controllers. Helpful for nested controllers.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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