From 30d8414cce00b5291397bfef4ad923ed8845b64e Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Tue, 29 Dec 2015 20:02:32 +0100 Subject: [PATCH] Add support for dynamic string-links in JsonApi adapter. --- CHANGELOG.md | 1 + .../serializer/adapter/json_api.rb | 10 +------- .../serializer/adapter/json_api/link.rb | 24 +++++++++++++------ test/adapter/json_api/links_test.rb | 7 +++++- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00ea5fa8..80cd0c68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Breaking changes: Features: +- [#1406](https://github.com/rails-api/active_model_serializers/pull/1406) Allow for custom dynamic values in JSON API links (@beauby) - [#1270](https://github.com/rails-api/active_model_serializers/pull/1270) Adds `assert_response_schema` test helper (@maurogeorge) - [#1099](https://github.com/rails-api/active_model_serializers/pull/1099) Adds `assert_serializer` test helper (@maurogeorge) - [#1403](https://github.com/rails-api/active_model_serializers/pull/1403) Add support for if/unless on attributes/associations (@beauby) diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index bf1e38ff..744d62e4 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -210,15 +210,7 @@ module ActiveModel def links_for(serializer) serializer._links.each_with_object({}) do |(name, value), hash| - hash[name] = - if value.respond_to?(:call) - link = Link.new(serializer) - link.instance_eval(&value) - - link.to_hash - else - value - end + hash[name] = Link.new(serializer, value).as_json end end diff --git a/lib/active_model/serializer/adapter/json_api/link.rb b/lib/active_model/serializer/adapter/json_api/link.rb index 45ce8960..bed230c3 100644 --- a/lib/active_model/serializer/adapter/json_api/link.rb +++ b/lib/active_model/serializer/adapter/json_api/link.rb @@ -3,29 +3,39 @@ module ActiveModel module Adapter class JsonApi class Link - def initialize(serializer) + def initialize(serializer, value) @object = serializer.object @scope = serializer.scope + + # Use the return value of the block unless it is nil. + if value.respond_to?(:call) + @value = instance_eval(&value) + else + @value = value + end end def href(value) - self._href = value + @href = value + nil end def meta(value) - self._meta = value + @meta = value + nil end - def to_hash - hash = { href: _href } - hash.merge!(meta: _meta) if _meta + def as_json + return @value if @value + + hash = { href: @href } + hash.merge!(meta: @meta) if @meta hash end protected - attr_accessor :_href, :_meta attr_reader :object, :scope end end diff --git a/test/adapter/json_api/links_test.rb b/test/adapter/json_api/links_test.rb index 1c5a6603..dbda88ea 100644 --- a/test/adapter/json_api/links_test.rb +++ b/test/adapter/json_api/links_test.rb @@ -13,6 +13,10 @@ module ActiveModel end link :other, '//example.com/resource' + + link :yet_another do + "//example.com/resource/#{object.id}" + end end def setup @@ -52,7 +56,8 @@ module ActiveModel stuff: 'value' } }, - other: '//example.com/resource' + other: '//example.com/resource', + yet_another: '//example.com/resource/1337' } assert_equal(expected, hash[:data][:links]) end