Links on a relationship can take a callable
This commit is contained in:
parent
c3376037e7
commit
d7f6963afc
11
README.md
11
README.md
@ -305,6 +305,17 @@ This will create a `self` reference for the relationship, and a `related` link f
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Relationship links can also be configured to be defined as a callable.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
has_many :actors, links: -> (object, params) {
|
||||||
|
{
|
||||||
|
self: "https://movies.com/#{object.id}/relationships/actors",
|
||||||
|
next: "https://movies.com/#{object.id}/relationships/actors?page%5Bnumber%5D=2&page%5Bsize%5D=10"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Meta Per Resource
|
### Meta Per Resource
|
||||||
|
|
||||||
For every resource in the collection, you can include a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship.
|
For every resource in the collection, you can include a meta object containing non-standard meta-information about a resource that can not be represented as an attribute or relationship.
|
||||||
|
@ -148,6 +148,8 @@ module FastJsonapi
|
|||||||
def add_links_hash(record, params, output_hash)
|
def add_links_hash(record, params, output_hash)
|
||||||
output_hash[key][:links] = if links.is_a?(Symbol)
|
output_hash[key][:links] = if links.is_a?(Symbol)
|
||||||
record.public_send(links)
|
record.public_send(links)
|
||||||
|
elsif links.respond_to?(:call)
|
||||||
|
FastJsonapi.call_proc(links, record, params)
|
||||||
else
|
else
|
||||||
links.each_with_object({}) do |(key, method), hash|
|
links.each_with_object({}) do |(key, method), hash|
|
||||||
Link.new(key: key, method: method).serialize(record, params, hash)
|
Link.new(key: key, method: method).serialize(record, params, hash)
|
||||||
|
12
spec/fixtures/movie.rb
vendored
12
spec/fixtures/movie.rb
vendored
@ -124,3 +124,15 @@ module Cached
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class CallableLinksMovieSerializer < ::MovieSerializer
|
||||||
|
has_many(
|
||||||
|
:first_two_actors,
|
||||||
|
id_method_name: :uid,
|
||||||
|
links: lambda do |record, params|
|
||||||
|
{ some: record.id, fancy: 'here' }
|
||||||
|
end
|
||||||
|
) do |record, params|
|
||||||
|
record.actors.take(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@ -142,5 +142,18 @@ RSpec.describe JSONAPI::Serializer do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with a callable as relationship links' do
|
||||||
|
let(:serialized) do
|
||||||
|
CallableLinksMovieSerializer.new(movie, params).serializable_hash.as_json
|
||||||
|
end
|
||||||
|
|
||||||
|
it do
|
||||||
|
expect(serialized['data']['relationships']['first_two_actors'])
|
||||||
|
.to have_link('some').with_value(movie.id)
|
||||||
|
expect(serialized['data']['relationships']['first_two_actors'])
|
||||||
|
.to have_link('fancy').with_value('here')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user