diff options
author | Joel Hawksley <joel@hawksley.org> | 2019-05-29 13:03:54 -0600 |
---|---|---|
committer | Joel Hawksley <joel@hawksley.org> | 2019-06-12 16:31:01 -0600 |
commit | c221b5b448569771678279216360460e066095a7 (patch) | |
tree | 6941280b09123cc0eddc1da12454e3d3e07cefea /actionview/test/lib | |
parent | 60af9db3745f994e8a4bd7afe9dfa6ea8be7bb7c (diff) | |
download | rails-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.rb | 46 |
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 |