start implementing json_api adapter to understand how associations should work

This commit is contained in:
Tema Bolshakov 2014-08-28 18:55:27 +04:00
parent 466c7d5dd8
commit 597765e3b0
5 changed files with 70 additions and 0 deletions

View File

@ -4,6 +4,7 @@ module ActiveModel
extend ActiveSupport::Autoload
autoload :SimpleAdapter
autoload :NullAdapter
autoload :JsonApiAdapter
attr_reader :serializer

View File

@ -0,0 +1,24 @@
module ActiveModel
class Serializer
class Adapter
class JsonApiAdapter < Adapter
def serializable_hash(options = {})
hash = serializer.attributes.each_with_object({}) do |(attr, value), h|
h[attr] = value
end
serializer.associations(only: [:id]).each_with_object({}) do |(attr, value), h|
case value
when ActiveModel::Serializer::ArraySerializer
# process has_many association
when ActiveModel::Serializer
# process belongs_to association
else
# what?
end
end
end
end
end
end
end

View File

@ -0,0 +1,31 @@
require 'test_helper'
module ActiveModel
class Serializer
class Adapter
class JsonApiTest < Minitest::Test
def setup
@post = ::Model.new(title: 'New Post', body: 'Body')
@first_comment = ::Model.new(id: 1, body: 'ZOMG A COMMENT')
@second_comment = ::Model.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
@post.comments = [@first_comment, @second_comment]
@first_comment.post = @post
@second_comment.post = @post
@post_serializer_class = def_serializer do
attributes :title, :body
has_many :comments
end
@post_serializer = @post_serializer_class.new(@post)
@adapter = ActiveModel::Serializer::Adapter::JsonApiAdapter.new(@post_serializer)
end
def test_includes_comment_ids
assert_equal(['1', '2'], @adapter.serializable_hash[:comments])
end
end
end
end
end

10
test/fixtures/poro.rb vendored
View File

@ -10,6 +10,16 @@ class Model
@attributes[name]
end
end
def method_missing(meth, *args)
if meth.to_s =~ /^(.*)=$/
@attributes[$1.to_sym] = args[0]
elsif @attributes.key?(meth)
@attributes[meth]
else
super
end
end
end
class Profile < Model

View File

@ -25,3 +25,7 @@ ActionController::TestCase.class_eval do
@routes = TestHelper::Routes
end
end
def def_serializer(&block)
Class.new(ActiveModel::Serializer, &block)
end