Module: Reactssr::Rails::ViewHelper

Defined in:
lib/reactssr/rails/view_helper.rb

Instance Method Summary collapse

Instance Method Details

#react_ssr(name, props = {}, options = {}, &block) ⇒ Object

See Also:

  • react_component`


8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
# File 'lib/reactssr/rails/view_helper.rb', line 8

def react_ssr(name, props = {}, options = {}, &block)
  options = {:tag => options} if options.is_a?(Symbol)

  prerender_options = options.fetch(:prerender, true)

  prerender_options = true if prerender_options == false

  # All the below stuff is to send the `controller_name`
  # and `action_name` to our ssr_renderer.
  # I am not too familiar with ruby, so if there is a better
  # way, please contribute!
  
  # Let reactssr-rails handle that.

  pre_options = {
    prerender_options: prerender_options,
    controller_path: controller_path,
    action_name: action_name
  }
  options.merge!(pre_options)

  block = Proc.new { concat ::React::ServerRendering.render(name, props, options) }
  
  html_options = options.reverse_merge(:data => {})
  html_options[:data].tap do |data|
    data[:react_props] = (props.is_a?(String) ? props : props.to_json)
  end
  html_tag = html_options[:tag] || :div

  # remove internally used properties so they aren't rendered to DOM
  html_options.except!(:tag, :rerender, :prerender_options, :controller_path, :action_name)

  output = (html_tag, '', html_options, &block)

  if options.fetch(:rerender, false)
    output << (:script, '', :data => {:reactssr_class => name.to_s})
  end

  output
end