aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/test/lib
diff options
context:
space:
mode:
authorJoel Hawksley <joel@hawksley.org>2019-05-29 13:03:54 -0600
committerJoel Hawksley <joel@hawksley.org>2019-06-12 16:31:01 -0600
commitc221b5b448569771678279216360460e066095a7 (patch)
tree6941280b09123cc0eddc1da12454e3d3e07cefea /actionview/test/lib
parent60af9db3745f994e8a4bd7afe9dfa6ea8be7bb7c (diff)
downloadrails-c221b5b448569771678279216360460e066095a7.tar.gz
rails-c221b5b448569771678279216360460e066095a7.tar.bz2
rails-c221b5b448569771678279216360460e066095a7.zip
`RenderingHelper` supports rendering objects that `respond_to?` `:render_in`
Co-authored-by: Natasha Umer <natashau@github.com> Co-authored-by: Aaron Patterson <tenderlove@github.com> Co-authored-by: Shawn Allen <shawnbot@github.com> Co-authored-by: Emily Plummer <emplums@github.com> Co-authored-by: Diana Mounter <broccolini@github.com> Co-authored-by: John Hawthorn <jhawthorn@github.com> Co-authored-by: Nathan Herald <myobie@github.com> Co-authored-by: Zaid Zawaideh <zawaideh@github.com> Co-authored-by: Zach Ahn <engineering@zachahn.com>
Diffstat (limited to 'actionview/test/lib')
-rw-r--r--actionview/test/lib/test_component.rb46
1 files changed, 46 insertions, 0 deletions
diff --git a/actionview/test/lib/test_component.rb b/actionview/test/lib/test_component.rb
new file mode 100644
index 0000000000..493b9487b1
--- /dev/null
+++ b/actionview/test/lib/test_component.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+class TestComponent < ActionView::Base
+ include ActiveModel::Validations
+
+ validates :content, :title, presence: true
+ delegate :render, to: :view_context
+
+ def initialize(title:)
+ @title = title
+ end
+
+ # Entrypoint for rendering. Called by ActionView::RenderingHelper#render.
+ #
+ # Returns ActionView::OutputBuffer.
+ def render_in(view_context, &block)
+ self.class.compile
+ @view_context = view_context
+ @content = view_context.capture(&block) if block_given?
+ validate!
+ rendered_template
+ end
+
+ def self.template
+ <<~'erb'
+ <span title="<%= title %>"><%= content %> (<%= render(plain: "Inline render") %>)</span>
+ erb
+ end
+
+ def self.compile
+ @compiled ||= nil
+ return if @compiled
+
+ class_eval(
+ "def rendered_template; @output_buffer = ActionView::OutputBuffer.new; " +
+ ActionView::Template::Handlers::ERB.erb_implementation.new(template, trim: true).src +
+ "; end"
+ )
+
+ @compiled = true
+ end
+
+private
+
+ attr_reader :content, :title, :view_context
+end