Class: Jets::Controller::Renderers::TemplateRenderer
- Inherits:
-
BaseRenderer
- Object
- BaseRenderer
- Jets::Controller::Renderers::TemplateRenderer
- Defined in:
- lib/jets/controller/renderers/template_renderer.rb
Instance Attribute Summary
Attributes inherited from BaseRenderer
Class Method Summary collapse
-
.find_app_helper_classes ⇒ Object
Does not include ApplicationHelper, will include ApplicationHelper explicitly first.
- .setup! ⇒ Object
- .setup_webpacker ⇒ Object
Instance Method Summary collapse
- #controller_instance_variables ⇒ Object
-
#default_template_name ⇒ Object
Example: posts/index.
-
#rackify_headers(headers) ⇒ Object
Takes headers and adds HTTP_ to front of the keys because that is what rack does to the headers passed from a request.
- #render ⇒ Object
- #render_options ⇒ Object
- #renderer_options ⇒ Object
-
#template_namespace ⇒ Object
PostsController => “posts” is the namespace.
Methods inherited from BaseRenderer
Constructor Details
This class inherits a constructor from Jets::Controller::Renderers::BaseRenderer
Class Method Details
.find_app_helper_classes ⇒ Object
Does not include ApplicationHelper, will include ApplicationHelper explicitly first.
138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 138 def find_app_helper_classes klasses = [] expression = "#{Jets.root}app/helpers/**/*" Dir.glob(expression).each do |path| next unless File.file?(path) class_name = path.sub("#{Jets.root}app/helpers/","").sub(/\.rb/,'') unless class_name == "application_helper" klasses << class_name.classify.constantize # autoload end end klasses end |
.setup! ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 118 def setup! require "action_controller" require "jets/overrides/rails" # Load helpers # Assign local variable because scoe in the `:action_view do` changes app_helper_classes = find_app_helper_classes ActiveSupport.on_load :action_view do include ApplicationHelper # include first app_helper_classes.each do |helper_class| include helper_class end end ActionController::Base.append_view_path("#{Jets.root}app/views") setup_webpacker if Jets.webpacker? end |
.setup_webpacker ⇒ Object
151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 151 def setup_webpacker require 'webpacker' require 'webpacker/helper' ActiveSupport.on_load :action_controller do ActionController::Base.helper Webpacker::Helper end ActiveSupport.on_load :action_view do include Webpacker::Helper end end |
Instance Method Details
#controller_instance_variables ⇒ Object
3 4 5 6 7 8 9 10 11 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 3 def controller_instance_variables instance_vars = @controller.instance_variables.inject({}) do |vars, v| k = v.to_s.sub(/^@/,'') # @var => var vars[k] = @controller.instance_variable_get(v) vars end instance_vars[:event] = event instance_vars end |
#default_template_name ⇒ Object
Example: posts/index
23 24 25 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 23 def default_template_name "#{template_namespace}/#{@controller.meth}" end |
#rackify_headers(headers) ⇒ Object
Takes headers and adds HTTP_ to front of the keys because that is what rack does to the headers passed from a request. This seems to be the standard when testing with curl and inspecting the headers in a Rack app. Example: gist.github.com/tongueroo/94f22f6c261c8999e4f4f776547e2ee3
This is useful for:
ActionController::Base.renderer.new()
renderer_options are rack normalized headers.
Example input (from api gateway)
{"host"=>"localhost:8888",
"user-agent"=>"curl/7.53.1",
"accept"=>"*/*",
"version"=>"HTTP/1.1",
"x-amzn-trace-id"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
Example output:
{"HTTP_HOST"=>"localhost:8888",
"HTTP_USER_AGENT"=>"curl/7.53.1",
"HTTP_ACCEPT"=>"*/*",
"HTTP_VERSION"=>"HTTP/1.1",
"HTTP_X_AMZN_TRACE_ID"=>"Root=1-5bde5b19-61d0d4ab4659144f8f69e38f"}
84 85 86 87 88 89 90 91 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 84 def rackify_headers(headers) results = {} headers.each do |k,v| rack_key = 'HTTP_' + k.gsub('-','_').upcase results[rack_key] = v end results end |
#render ⇒ Object
13 14 15 16 17 18 19 20 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 13 def render # Rails rendering does heavy lifting renderer = ActionController::Base.renderer.new() body = renderer.render() @options[:body] = body # important to set as it was originally nil RackRenderer.new(@controller, @options).render end |
#render_options ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 93 def # nomralize the template option template = @options[:template] if template and !template.include?('/') template = "#{template_namespace}/#{template}" end template ||= default_template_name # ready to override @options[:template] @options[:template] = template if @options[:template] = { template: template, # weird: template needs to be set no matter because it # sets the name which is used in lookup_context.rb:209:in `normalize_name' layout: @options[:layout], assigns: controller_instance_variables, } types = %w[json inline plain file xml body action].map(&:to_sym) types.each do |type| [type] = @options[type] if @options[type] end end |
#renderer_options ⇒ Object
default options:
https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/renderer.rb#L41-L47
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 34 def = { # script_name: "", # unfortunately doesnt seem to effect relative_url_root like desired # input: "" } origin = headers["origin"] if origin uri = URI.parse(origin) [:https] = uri.scheme == "https" end # Important to not use rack_headers as local variable instead of headers. # headers is a method that gets deleted to controller.headers and using it # seems to cause issues. rack_headers = rackify_headers(headers) .merge!(rack_headers) # Note @options[:method] uses @options vs options on purpose @options[:method] = event["httpMethod"].downcase if event["httpMethod"] end |
#template_namespace ⇒ Object
PostsController => “posts” is the namespace
28 29 30 |
# File 'lib/jets/controller/renderers/template_renderer.rb', line 28 def template_namespace @controller.class.to_s.sub('Controller','').underscore.pluralize end |