Skip to content

Commit 886cbe5

Browse files
committed
Scope related route names in a similar manner to relationship routes
This dodges an issue where the related route names might conflict with index routes (e.g. a List that `has_many :items, class_name: 'ListItem'` would have previously used `list_items` for the related resources and conflict with the `list_items` index route for the ListItem class`)
1 parent 873cbd8 commit 886cbe5

File tree

5 files changed

+52
-2
lines changed

5 files changed

+52
-2
lines changed

lib/jsonapi/link_builder.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,14 @@ def resource_url_helper_name_from_source(source)
150150

151151
def related_url_helper_name(relationship)
152152
relationship_parts = resource_path_parts_from_class(relationship.parent_resource)
153+
relationship_parts << "related"
153154
relationship_parts << relationship.name
154155
url_helper_name_from_parts(relationship_parts)
155156
end
156157

157158
def singleton_related_url_helper_name(relationship)
158159
relationship_parts = []
160+
relationship_parts << "related"
159161
relationship_parts << relationship.name
160162
relationship_parts += resource_path_parts_from_class(relationship.parent_resource)
161163
url_helper_name_from_parts(relationship_parts)

lib/jsonapi/routing_ext.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def jsonapi_related_resource(*relationship)
235235
match formatted_relationship_name, controller: options[:controller],
236236
relationship: relationship.name, source: resource_type_with_module_prefix(source._type),
237237
action: 'get_related_resource', via: [:get],
238-
as: relationship_name
238+
as: "related/#{relationship_name}"
239239
end
240240

241241
def jsonapi_related_resources(*relationship)
@@ -253,7 +253,7 @@ def jsonapi_related_resources(*relationship)
253253
controller: options[:controller],
254254
relationship: relationship.name, source: resource_type_with_module_prefix(source._type),
255255
action: 'get_related_resources', via: [:get],
256-
as: relationship_name
256+
as: "related/#{relationship_name}"
257257
end
258258

259259
protected

test/fixtures/active_record.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,14 @@
330330
t.string :name
331331
t.belongs_to :painting
332332
end
333+
334+
create_table :lists, force: true do |t|
335+
t.string :name
336+
end
337+
338+
create_table :list_items, force: true do |t|
339+
t.belongs_to :list
340+
end
333341
# special cases
334342
end
335343

@@ -687,6 +695,15 @@ class Painting < ActiveRecord::Base
687695
class Collector < ActiveRecord::Base
688696
belongs_to :painting
689697
end
698+
699+
class List < ActiveRecord::Base
700+
has_many :items, class_name: 'ListItem', inverse_of: :list
701+
end
702+
703+
class ListItem < ActiveRecord::Base
704+
belongs_to :list, inverse_of: :items
705+
end
706+
690707
### CONTROLLERS
691708
class AuthorsController < JSONAPI::ResourceControllerMetal
692709
end
@@ -994,6 +1011,12 @@ class DoctorsController < JSONAPI::ResourceController
9941011
class RespondentController < JSONAPI::ResourceController
9951012
end
9961013

1014+
class ListsController < JSONAPI::ResourceController
1015+
end
1016+
1017+
class ListItemsController < JSONAPI::ResourceController
1018+
end
1019+
9971020
### RESOURCES
9981021
class BaseResource < JSONAPI::Resource
9991022
abstract
@@ -2081,6 +2104,14 @@ class RespondentResource < JSONAPI::Resource
20812104
abstract
20822105
end
20832106

2107+
class ListResource < JSONAPI::Resource
2108+
has_many :items, class_name: 'ListItem'
2109+
end
2110+
2111+
class ListItemResource < JSONAPI::Resource
2112+
has_one :list
2113+
end
2114+
20842115
### PORO Data - don't do this in a production app
20852116
$breed_data = BreedData.new
20862117
$breed_data.add(Breed.new(0, 'persian'))

test/integration/routes/routes_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,20 @@ def test_routing_author_links_posts_create_not_acts_as_set
191191
{controller: 'api/v5/authors', action: 'create_relationship', author_id: '1', relationship: 'posts'})
192192
end
193193

194+
def test_routing_list_items_index
195+
assert_routing({path: '/list_items', method: :get},
196+
{controller: 'list_items', action: 'index'})
197+
end
198+
199+
def test_routing_list_related_items
200+
assert_routing({path: '/lists/1/items', method: :get},
201+
{controller: 'list_items', action: 'get_related_resources', relationship: 'items', list_id: '1', source: 'lists'})
202+
end
203+
204+
def test_list_items_route_helper_name
205+
assert_equal(list_items_path, '/list_items')
206+
end
207+
194208
#primary_key
195209
def test_routing_primary_key_jsonapi_resources
196210
assert_routing({path: '/iso_currencies/USD', method: :get},

test/test_helper.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,9 @@ class CatResource < JSONAPI::Resource
268268
jsonapi_resources :employees
269269
jsonapi_resources :web_pages
270270

271+
jsonapi_resources :lists
272+
jsonapi_resources :list_items
273+
271274
jsonapi_resources :person_with_even_and_odd_posts
272275

273276
namespace :api do

0 commit comments

Comments
 (0)