lib/human_routes/context.rb in human_routes-0.0.2 vs lib/human_routes/context.rb in human_routes-0.0.3

- old
+ new

@@ -16,17 +16,21 @@ def singular_controller_name @singular_controller_name ||= controller_name.singularize end + def resource? + controller_name == singular_controller_name + end + def routes @routes ||= [] end def create(*args) path, name, options = extract_route_args( - default_path: "#{controller_name}/new", + segment: :new, default_name: "new_#{singular_controller_name}", args: args ) routes << [ @@ -50,11 +54,11 @@ ] end def update(*args) path, name, options = extract_route_args( - default_path: "#{controller_name}/:id/edit", + segment: :edit, default_name: "edit_#{singular_controller_name}", args: args ) routes << [ @@ -78,11 +82,11 @@ ] end def remove(*args) path, name, options = extract_route_args( - default_path: "#{controller_name}/:id/remove", + segment: :remove, default_name: "remove_#{singular_controller_name}", args: args ) routes << [ @@ -106,11 +110,11 @@ ] end def list(*args) path, name, options = extract_route_args( - default_path: controller_name, + segment: :list, default_name: controller_name, args: args ) routes << [ @@ -124,11 +128,11 @@ ] end def show(*args) path, name, options = extract_route_args( - default_path: "#{controller_name}/:id", + segment: :show, default_name: singular_controller_name, args: args ) routes << [ @@ -144,25 +148,56 @@ def all create update remove - list show + list unless controller_name == controller_name.singularize end - private def extract_route_args(default_path:, default_name:, args:) + private def extract_route_args(segment:, default_name:, args:) route_options = args.extract_options! route_options = default_options.merge(options).merge(route_options) - path = args.first || default_path - name = route_options.delete(:as) || default_name + path = args.first || path_for(segment, route_options) + name = route_options.delete(:as) { default_name.underscore.tr("/", "_") } [path, name, route_options] end private def default_options { format: false } + end + + private def path_for(segment, options) + param = options.fetch(:param, :id) + + segments = if resource? + resource_segments(segment, param) + else + resources_segments(segment, param) + end + + segments.compact.join("/") + end + + private def resource_segments(segment, _param) + segments = [controller_name] + segments << segment unless segment == :show + segments + end + + private def resources_segments(segment, param) + case segment + when :list + [controller_name] + when :new + [controller_name, segment] + when :show + [controller_name, ":#{param}"] + else + [controller_name, ":#{param}", segment] + end end end end