Class: InertiaRails::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/inertia_rails/renderer.rb

Instance Method Summary collapse

Constructor Details

#initialize(component, controller, request, response, render_method, **options) ⇒ Renderer

Returns a new instance of Renderer.



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
# File 'lib/inertia_rails/renderer.rb', line 19

def initialize(component, controller, request, response, render_method, **options)
  if component.is_a?(Hash) && options.key?(:props)
    raise ArgumentError,
          'Parameter `props` is not allowed when passing a Hash as the first argument'
  end

  @controller = controller
  @configuration = controller.__send__(:inertia_configuration)
  @request = request
  @response = response
  @render_method = render_method
  @view_data = options.fetch(:view_data, {})
  @encrypt_history = options.fetch(:encrypt_history, @configuration.encrypt_history)
  @clear_history = options.fetch(:clear_history, controller.session[:inertia_clear_history] || false)

  deep_merge = options.fetch(:deep_merge, @configuration.deep_merge_shared_data)
  passed_props = options.fetch(:props,
                               component.is_a?(Hash) ? component : @controller.__send__(:inertia_view_assigns))
  @props = merge_props(shared_data, passed_props, deep_merge)

  @component = resolve_component(component)

  @controller.instance_variable_set('@_inertia_rendering', true)
  controller.inertia_meta.add(options[:meta]) if options[:meta]
end

Instance Method Details

#renderObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/inertia_rails/renderer.rb', line 45

def render
  @response.headers['Vary'] = if @response.headers['Vary'].blank?
                                'X-Inertia'
                              else
                                "#{@response.headers['Vary']}, X-Inertia"
                              end
  if @request.headers['X-Inertia']
    @response.set_header('X-Inertia', 'true')
    @render_method.call json: page.to_json, status: @response.status, content_type: Mime[:json]
  else
    begin
      return render_ssr if @configuration.ssr_enabled
    rescue StandardError
      nil
    end
    @controller.instance_variable_set('@_inertia_page', page)
    @render_method.call template: 'inertia', layout: layout, locals: @view_data.merge(page: page)
  end
end