Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 35 additions & 2 deletions lib/jb/action_view_monkeys.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 3 additions & 0 deletions test/dummy_app/app/views/layouts/application.json.jb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
metadata: 'metadata layout'
}.merge(yield)
2 changes: 2 additions & 0 deletions test/features/jb_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand All @@ -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
Expand Down