Module: ViewComponent::RenderPreviewHelper

Defined in:
lib/view_component/render_preview_helper.rb

Instance Method Summary collapse

Instance Method Details

#render_preview(name) ⇒ Nokogiri::HTML

Render a preview inline. Internally sets ‘page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used:

“‘ruby render_preview(:default) assert_text(“Hello, World!”) “`

Note: ‘#rendered_preview` expects a preview to be defined with the same class name as the calling test, but with `Test` replaced with `Preview`:

MyComponentTest -> MyComponentPreview etc.

In RSpec, ‘Preview` is appended to `described_class`.

Parameters:

  • preview (String)

    The name of the preview to be rendered.

Returns:

  • (Nokogiri::HTML)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/view_component/render_preview_helper.rb', line 22

def render_preview(name)
  begin
    preview_klass = if respond_to?(:described_class)
      if described_class.nil?
        raise "`render_preview` expected a described_class, but it is nil."
      end

      "#{described_class}Preview"
    else
      self.class.name.gsub("Test", "Preview")
    end
    preview_klass = preview_klass.constantize
  rescue NameError
    raise NameError.new(
      "`render_preview` expected to find #{preview_klass}, but it does not exist."
    )
  end

  previews_controller = build_controller(ViewComponent::Base.preview_controller.constantize)
  previews_controller.request.params[:path] = "#{preview_klass.preview_name}/#{name}"
  previews_controller.response = ActionDispatch::Response.new
  result = previews_controller.previews

  @rendered_content = result

  Nokogiri::HTML.fragment(@rendered_content)
end