From 970b542549ee4aeb2ee4215f89e77aab8f975273 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Wed, 9 Jul 2014 17:52:31 -0400 Subject: [PATCH] Implement basic rendering Woo actioncontroller --- lib/action_controller/serialization.rb | 24 ++++++++++++++++++ lib/active_model/serializer.rb | 22 ++++++++++++++++ .../serializer/adapter/null_adapter.rb | 4 +-- lib/active_model_serializers.rb | 11 ++++++++ test/action_controller/serialization_test.rb | 25 +++++++++++++++++++ test/test_helper.rb | 18 +++++++++++++ 6 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 lib/action_controller/serialization.rb create mode 100644 test/action_controller/serialization_test.rb diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb new file mode 100644 index 00000000..d51aba0f --- /dev/null +++ b/lib/action_controller/serialization.rb @@ -0,0 +1,24 @@ +require 'active_support/core_ext/class/attribute' + +module ActionController + module Serialization + extend ActiveSupport::Concern + + include ActionController::Renderers + + def _render_option_json(resource, options) + serializer = ActiveModel::Serializer.serializer_for(resource) + + if serializer + # omg hax + object = serializer.new(resource) + adapter = ActiveModel::Serializer::Adapter::NullAdapter.new(object) + + super(adapter, options) + else + super + end + end + end +end + diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 0216861b..610bc596 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -19,6 +19,28 @@ module ActiveModel end end + if RUBY_VERSION >= '2.0' + def self.serializer_for(resource) + if resource.respond_to?(:to_ary) + ArraySerializer + else + begin + Object.const_get "#{resource.class.name}Serializer" + rescue NameError + nil + end + end + end + else + def self.serializer_for(resource) + if resource.respond_to?(:to_ary) + ArraySerializer + else + "#{resource.class.name}Serializer".safe_constantize + end + end + end + attr_accessor :object def initialize(object) diff --git a/lib/active_model/serializer/adapter/null_adapter.rb b/lib/active_model/serializer/adapter/null_adapter.rb index dc343c22..9e310de4 100644 --- a/lib/active_model/serializer/adapter/null_adapter.rb +++ b/lib/active_model/serializer/adapter/null_adapter.rb @@ -6,10 +6,10 @@ module ActiveModel @serializer = serializer end - def to_json + def to_json(options={}) @serializer.attributes.each_with_object({}) do |(attr, value), h| h[attr] = value - end.to_json + end.to_json # FIXME: why does passing options here cause {}? end end end diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 27c254ba..ae6a3cd4 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -4,3 +4,14 @@ require "active_model/serializer/version" require "active_model/serializer" require "active_model/serializer/adapter/null_adapter" + +begin + require 'action_controller' + require 'action_controller/serialization' + + ActiveSupport.on_load(:action_controller) do + include ::ActionController::Serialization + end +rescue LoadError + # rails not installed, continuing +end diff --git a/test/action_controller/serialization_test.rb b/test/action_controller/serialization_test.rb new file mode 100644 index 00000000..c4ee3497 --- /dev/null +++ b/test/action_controller/serialization_test.rb @@ -0,0 +1,25 @@ +require 'test_helper' + +module ActionController + module Serialization + class ImplicitSerializerTest < ActionController::TestCase + class MyController < ActionController::Base + def render_using_implicit_serializer + render json: Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) + end + end + + tests MyController + + # We just have Null for now, this will change + def test_render_using_implicit_serializer + get :render_using_implicit_serializer + + assert_equal 'application/json', @response.content_type + assert_equal '{"name":"Name 1","description":"Description 1"}', @response.body + end + end + end +end + + diff --git a/test/test_helper.rb b/test/test_helper.rb index 8cb71ca3..3fd3776c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,9 +1,27 @@ require "bundler/setup" require 'rails' +require 'action_controller' +require 'action_controller/test_case' require "active_support/json" require 'minitest/autorun' require "active_model_serializers" require 'fixtures/poro' + +module TestHelper + Routes = ActionDispatch::Routing::RouteSet.new + Routes.draw do + get ':controller(/:action(/:id))' + get ':controller(/:action)' + end + + ActionController::Base.send :include, Routes.url_helpers +end + +ActionController::TestCase.class_eval do + def setup + @routes = TestHelper::Routes + end +end