diff --git a/lib/jb/action_view_monkeys.rb b/lib/jb/action_view_monkeys.rb index 718c34e..8c13377 100644 --- a/lib/jb/action_view_monkeys.rb +++ b/lib/jb/action_view_monkeys.rb @@ -40,15 +40,48 @@ module RenderCollectionExtension end end + # An alternative OutputFlow that holds each content in Hash/Array as-is + class RawOutputFlow + attr_reader :content + + def initialize + @content = Hash.new + end + + def get(key) + @content[key] + end + + def set(key, value) + @content[key] = value.extend(Jb::PartialRenderer::StrongArray) + end + + def append(key, value) + if @content[key].nil? + set(key, value) + elsif @content[key].respond_to?(:merge) + @content[key].merge(value) + else + @content[key].concat(value) + end + end + alias_method :append!, :append + end + # A monkey-patch that converts non-partial result to a JSON String module TemplateRenderer module JSONizer def render_template(template, *) - template.respond_to?(:handler) && (template.handler == Jb::Handler) ? MultiJson.dump(super) : super + if template.respond_to?(:handler) && template.handler == Jb::Handler + @view.view_flow = RawOutputFlow.new unless @view.view_flow.is_a?(RawOutputFlow) + MultiJson.dump(super) + else + super + end end end end end ::ActionView::PartialRenderer.prepend ::Jb::PartialRenderer::JbTemplateDetector -::ActionView::TemplateRenderer.prepend ::Jb::TemplateRenderer::JSONizer +::ActionView::TemplateRenderer.prepend ::Jb::TemplateRenderer::JSONizer \ No newline at end of file diff --git a/test/dummy_app/app/views/layouts/application.json.jb b/test/dummy_app/app/views/layouts/application.json.jb new file mode 100644 index 0000000..ab1c1aa --- /dev/null +++ b/test/dummy_app/app/views/layouts/application.json.jb @@ -0,0 +1,3 @@ +{ + metadata: 'metadata layout' +}.merge(yield) diff --git a/test/features/jb_test.rb b/test/features/jb_test.rb index d9ebef0..2678931 100644 --- a/test/features/jb_test.rb +++ b/test/features/jb_test.rb @@ -12,6 +12,7 @@ class JbTest < ActionDispatch::IntegrationTest assert_equal 'comment 1', json['comments'][0]['body'] assert_equal 'comment 2', json['comments'][1]['body'] assert_equal 'comment 3', json['comments'][2]['body'] + assert_equal 'metadata layout', json['metadata'] end @@ -22,6 +23,7 @@ class JbTest < ActionDispatch::IntegrationTest assert_equal 'post 2', json['title'] assert_equal [], json['comments'] + assert_equal 'metadata layout', json['metadata'] end test ':plain handler still works' do