diff --git a/README.md b/README.md index 7282b349..4fcc37fd 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,8 @@ resources in the `"linked"` member when the resource names are included in the `include` option. ```ruby + render @posts, include: ['authors', 'comments'] + # or render @posts, include: 'authors,comments' ``` diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index a8887369..f604b67f 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -121,7 +121,9 @@ module ActiveModel end def check_assoc(assoc) - @options[:include].split(',').any? do |s| + include_opt = @options[:include] + include_opt = include_opt.split(',') if include_opt.is_a?(String) + include_opt.any? do |s| s.match(/^#{assoc.gsub('.', '\.')}/) end end diff --git a/test/action_controller/json_api_linked_test.rb b/test/action_controller/json_api_linked_test.rb index f909641d..7d4dcbf8 100644 --- a/test/action_controller/json_api_linked_test.rb +++ b/test/action_controller/json_api_linked_test.rb @@ -52,7 +52,7 @@ module ActionController def render_resource_with_nested_has_many_include setup_post - render json: @post, include: 'author,author.roles', adapter: :json_api + render json: @post, include: ['author', 'author.roles'], adapter: :json_api end def render_resource_with_missing_nested_has_many_include @@ -74,7 +74,7 @@ module ActionController def render_collection_with_include setup_post - render json: [@post], include: 'author,comments', adapter: :json_api + render json: [@post], include: ['author', 'comments'], adapter: :json_api end end diff --git a/test/adapter/json_api/belongs_to_test.rb b/test/adapter/json_api/belongs_to_test.rb index 77dc3b5a..a235f5d4 100644 --- a/test/adapter/json_api/belongs_to_test.rb +++ b/test/adapter/json_api/belongs_to_test.rb @@ -89,7 +89,7 @@ module ActiveModel def test_include_linked_resources_with_type_name serializer = BlogSerializer.new(@blog) - adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, include: "writer,articles") + adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer, include: ['writer', 'articles']) linked = adapter.serializable_hash[:linked] expected = { authors: [{ diff --git a/test/adapter/json_api/has_many_explicit_serializer_test.rb b/test/adapter/json_api/has_many_explicit_serializer_test.rb index 8d21b3fd..0f99f0ec 100644 --- a/test/adapter/json_api/has_many_explicit_serializer_test.rb +++ b/test/adapter/json_api/has_many_explicit_serializer_test.rb @@ -24,7 +24,7 @@ module ActiveModel @serializer = PostPreviewSerializer.new(@post) @adapter = ActiveModel::Serializer::Adapter::JsonApi.new( @serializer, - include: 'comments,author' + include: ['comments', 'author'] ) end diff --git a/test/adapter/json_api/linked_test.rb b/test/adapter/json_api/linked_test.rb index ba9fa21f..f11b06e3 100644 --- a/test/adapter/json_api/linked_test.rb +++ b/test/adapter/json_api/linked_test.rb @@ -14,14 +14,21 @@ module ActiveModel @second_post = Post.new(id: 20, title: 'New Post', body: 'Body') @third_post = Post.new(id: 30, title: 'Yet Another Post', body: 'Body') @blog = Blog.new({ name: 'AMS Blog' }) + @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT') + @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT') @first_post.blog = @blog @second_post.blog = @blog @third_post.blog = nil - @first_post.comments = [] + @first_post.comments = [@first_comment, @second_comment] @second_post.comments = [] + @third_post.comments = [] @first_post.author = @author1 @second_post.author = @author2 @third_post.author = @author1 + @first_comment.post = @first_post + @first_comment.author = nil + @second_comment.post = @first_post + @second_comment.author = nil @author1.posts = [@first_post, @third_post] @author1.bio = @bio1 @author1.roles = [] @@ -33,116 +40,144 @@ module ActiveModel end def test_include_multiple_posts_and_linked - @serializer = ArraySerializer.new([@first_post, @second_post]) - @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'author,author.bio,comments') - - @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT') - @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT') - @first_post.comments = [@first_comment, @second_comment] - @first_comment.post = @first_post - @first_comment.author = nil - @second_comment.post = @first_post - @second_comment.author = nil - assert_equal([ - { title: "Hello!!", body: "Hello, world!!", id: "10", links: { comments: ['1', '2'], blog: "999", author: "1" } }, - { title: "New Post", body: "Body", id: "20", links: { comments: [], blog: "999", author: "2" } } - ], @adapter.serializable_hash[:posts]) - + serializer = ArraySerializer.new([@first_post, @second_post]) + adapter = ActiveModel::Serializer::Adapter::JsonApi.new( + serializer, + include: ['author', 'author.bio', 'comments'] + ) + alt_adapter = ActiveModel::Serializer::Adapter::JsonApi.new( + serializer, + include: 'author,author.bio,comments' + ) expected = { - comments: [{ - id: "1", - body: "ZOMG A COMMENT", - links: { - post: "10", - author: nil + linked: { + comments: [ + { + id: "1", + body: "ZOMG A COMMENT", + links: { + post: "1", + author: nil + } + }, { + id: "2", + body: "ZOMG ANOTHER COMMENT", + links: { + post: "1", + author: nil + } + } + ], + authors: [ + { + id: "1", + name: "Steve K.", + links: { + posts: ["1", "3"], + roles: [], + bio: "1" + } + }, { + id: "2", + name: "Tenderlove", + links: { + posts: ["2"], + roles: [], + bio: "2" + } + } + ], + bios: [ + { + id: "1", + content: "AMS Contributor", + links: { + author: "1" + } + }, { + id: "2", + content: "Rails Contributor", + links: { + author: "2" + } + } + ] + }, + posts: [ + { + id: "10", + title: "Hello!!", + body: "Hello, world!!", + links: { + comments: ['1', '2'], + blog: "999", + author: "1" + } + }, + { + id: "2", + title: "New Post", + body: "Body", + links: { + comments: [], + blog: "999", + author: "2" + } } - }, { - id: "2", - body: "ZOMG ANOTHER COMMENT", - links: { - post: "10", - author: nil - } - }], - authors: [{ - id: "1", - name: "Steve K.", - links: { - posts: ["10", "30"], - roles: [], - bio: "1" - } - }, { - id: "2", - name: "Tenderlove", - links: { - posts: ["20"], - roles: [], - bio: "2" - } - }], - bios: [{ - id: "1", - content: "AMS Contributor", - links: { - author: "1" - } - }, { - id: "2", - content: "Rails Contributor", - links: { - author: "2" - } - }] + ] } - assert_equal expected, @adapter.serializable_hash[:linked] + assert_equal expected, adapter.serializable_hash + assert_equal expected, alt_adapter.serializable_hash end - def test_include_bio_and_linked - @serializer = BioSerializer.new(@bio1) - @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer, include: 'author,author.posts') - - @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT') - @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT') - @first_post.comments = [@first_comment, @second_comment] - @third_post.comments = [] - @first_comment.post = @first_post - @first_comment.author = nil - @second_comment.post = @first_post - @second_comment.author = nil + def test_include_multiple_posts_and_linked + serializer = BioSerializer.new @bio1 + adapter = ActiveModel::Serializer::Adapter::JsonApi.new( + serializer, + include: ['author', 'author.posts'] + ) + alt_adapter = ActiveModel::Serializer::Adapter::JsonApi.new( + serializer, + include: 'author,author.posts' + ) expected = { - authors: [{ - id: "1", - name: "Steve K.", - links: { - posts: ["10", "30"], - roles: [], - bio: "1" + authors: [ + { + id: "1", + name: "Steve K.", + links: { + posts: ["10", "30"], + roles: [], + bio: "1" + } } - }], - posts: [{ - title: "Hello!!", - body: "Hello, world!!", - id: "10", - links: { - comments: ["1", "2"], - blog: "999", - author: "1" + ], + posts: [ + { + id: "10", + title: "Hello!!", + body: "Hello, world!!", + links: { + comments: ["1", "2"], + blog: "999", + author: "1" + } + }, { + id: "30", + title: "Yet Another Post", + body: "Body", + links: { + comments: [], + blog: nil, + author: "1" + } } - }, { - title: "Yet Another Post", - body: "Body", - id: "30", - links: { - comments: [], - blog: nil, - author: "1" - } - }] + ] } - assert_equal expected, @adapter.serializable_hash[:linked] + assert_equal expected, adapter.serializable_hash[:linked] + assert_equal expected, alt_adapter.serializable_hash[:linked] end def test_ignore_model_namespace_for_linked_resource_type