From d280afd931ab9618ba336d0e5a61e56a3f618652 Mon Sep 17 00:00:00 2001 From: Nick Urban Date: Wed, 9 Nov 2016 16:17:34 -0700 Subject: [PATCH 1/5] Nested resources working --- lib/jsonapi/link_builder.rb | 17 +++++++++++++---- lib/jsonapi/resource.rb | 6 ++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/jsonapi/link_builder.rb b/lib/jsonapi/link_builder.rb index 1799152fc..af2c7ffab 100644 --- a/lib/jsonapi/link_builder.rb +++ b/lib/jsonapi/link_builder.rb @@ -77,23 +77,32 @@ def engine_primary_resources_url def engine_resource_path(source) resource_path_name = engine_resource_path_name_from_source(source) - engine_name.routes.url_helpers.public_send(resource_path_name, source.id) + + path_parameters = source.context.try(:[], :path_parameters) || [] + path_parameters << source.id + engine_name.routes.url_helpers.public_send(resource_path_name, *path_parameters) end def engine_resource_path_name_from_source(source) - scopes = module_scopes_from_class(source.class)[1..-1] - base_path_name = scopes.map { |scope| scope.underscore }.join("_") + scopes = scopes_from_source(source) + base_path_name = scopes.map(&:underscore).join("_") end_path_name = source.class._type.to_s.singularize [base_path_name, end_path_name, "path"].reject(&:blank?).join("_") end + # Allow overriding scopes, e.g. for nested resources. + # TODO: use this method for all path generation + def scopes_from_source(source) + source.custom_route_scopes || module_scopes_from_class(source.class)[1..-1] + end + def engine_resource_url(source) "#{ base_url }#{ engine_resource_path(source) }" end def engine_resources_path_name_from_class(klass) scopes = module_scopes_from_class(klass)[1..-1] - base_path_name = scopes.map { |scope| scope.underscore }.join("_") + base_path_name = scopes.map(&:underscore).join("_") end_path_name = klass._type.to_s if base_path_name.blank? diff --git a/lib/jsonapi/resource.rb b/lib/jsonapi/resource.rb index 14c34d417..a0d6f12a7 100644 --- a/lib/jsonapi/resource.rb +++ b/lib/jsonapi/resource.rb @@ -169,6 +169,12 @@ def custom_links(_options) {} end + # Override this to add a custom route scope. + # e.g. to support nested resource routes. + def custom_route_scopes + nil + end + def preloaded_fragments # A hash of hashes @preloaded_fragments ||= Hash.new From eb1181a215f6db26b335ba3ffc41e9588b377c25 Mon Sep 17 00:00:00 2001 From: Nick Urban Date: Wed, 9 Nov 2016 19:27:44 -0700 Subject: [PATCH 2/5] call to_s before calling underscore on scopes --- lib/jsonapi/link_builder.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/jsonapi/link_builder.rb b/lib/jsonapi/link_builder.rb index af2c7ffab..9b541e718 100644 --- a/lib/jsonapi/link_builder.rb +++ b/lib/jsonapi/link_builder.rb @@ -85,9 +85,9 @@ def engine_resource_path(source) def engine_resource_path_name_from_source(source) scopes = scopes_from_source(source) - base_path_name = scopes.map(&:underscore).join("_") + base_path_name = scopes.map { |scope| scope.to_s.underscore }.join('_') end_path_name = source.class._type.to_s.singularize - [base_path_name, end_path_name, "path"].reject(&:blank?).join("_") + [base_path_name, end_path_name, 'path'].reject(&:blank?).join('_') end # Allow overriding scopes, e.g. for nested resources. @@ -102,7 +102,7 @@ def engine_resource_url(source) def engine_resources_path_name_from_class(klass) scopes = module_scopes_from_class(klass)[1..-1] - base_path_name = scopes.map(&:underscore).join("_") + base_path_name = scopes.map { |scope| scope.to_s.underscore }.join('_') end_path_name = klass._type.to_s if base_path_name.blank? From 3a0f08e5dc7d9271c56bfb1a82e2854c159c35e6 Mon Sep 17 00:00:00 2001 From: Nick Urban Date: Thu, 10 Nov 2016 14:23:43 -0700 Subject: [PATCH 3/5] Change custom_route_scopes into a class method --- lib/jsonapi/resource.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/jsonapi/resource.rb b/lib/jsonapi/resource.rb index a0d6f12a7..615d3f9c3 100644 --- a/lib/jsonapi/resource.rb +++ b/lib/jsonapi/resource.rb @@ -171,7 +171,7 @@ def custom_links(_options) # Override this to add a custom route scope. # e.g. to support nested resource routes. - def custom_route_scopes + def self.custom_route_scopes nil end @@ -465,8 +465,12 @@ def _resource_name_from_type(type) end def resource_type_for(model) - model_name = model.class.to_s.underscore - if _model_hints[model_name] + resource_type_for_class(model.class) + end + + def resource_type_for_class(klass) + model_name = klass.to_s.underscore + if _model_hints.try(:[], model_name) _model_hints[model_name] else model_name.rpartition('/').last From 028d1bb22b542798bda099d38e56358be9ed53c3 Mon Sep 17 00:00:00 2001 From: Nick Urban Date: Thu, 10 Nov 2016 14:44:40 -0700 Subject: [PATCH 4/5] Replace scopes_from_source with scopes_from_resource_class method --- lib/jsonapi/link_builder.rb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/jsonapi/link_builder.rb b/lib/jsonapi/link_builder.rb index 9b541e718..2381d49bd 100644 --- a/lib/jsonapi/link_builder.rb +++ b/lib/jsonapi/link_builder.rb @@ -84,16 +84,15 @@ def engine_resource_path(source) end def engine_resource_path_name_from_source(source) - scopes = scopes_from_source(source) + scopes = scopes_from_resource_class(source.class) base_path_name = scopes.map { |scope| scope.to_s.underscore }.join('_') end_path_name = source.class._type.to_s.singularize [base_path_name, end_path_name, 'path'].reject(&:blank?).join('_') end - # Allow overriding scopes, e.g. for nested resources. - # TODO: use this method for all path generation - def scopes_from_source(source) - source.custom_route_scopes || module_scopes_from_class(source.class)[1..-1] + def scopes_from_resource_class(resource_klass) + # Extension point -- allow overriding scopes in Resource definition, e.g. for nested resources. + resource_klass.custom_route_scopes || module_scopes_from_class(resource_klass)[1..-1] end def engine_resource_url(source) @@ -101,7 +100,7 @@ def engine_resource_url(source) end def engine_resources_path_name_from_class(klass) - scopes = module_scopes_from_class(klass)[1..-1] + scopes = scopes_from_resource_class(klass) base_path_name = scopes.map { |scope| scope.to_s.underscore }.join('_') end_path_name = klass._type.to_s From 81216bcb36e386e2e9f40d1f4a94d02318c9f7c7 Mon Sep 17 00:00:00 2001 From: Nick Urban Date: Thu, 10 Nov 2016 15:28:02 -0700 Subject: [PATCH 5/5] Remove unnecessary change --- lib/jsonapi/resource.rb | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/jsonapi/resource.rb b/lib/jsonapi/resource.rb index 615d3f9c3..54c98d922 100644 --- a/lib/jsonapi/resource.rb +++ b/lib/jsonapi/resource.rb @@ -465,12 +465,8 @@ def _resource_name_from_type(type) end def resource_type_for(model) - resource_type_for_class(model.class) - end - - def resource_type_for_class(klass) - model_name = klass.to_s.underscore - if _model_hints.try(:[], model_name) + model_name = model.class.to_s.underscore + if _model_hints[model_name] _model_hints[model_name] else model_name.rpartition('/').last