class Futurism::Resolver::Controller::Renderer
Constants
- HTTP_METHODS
Attributes
connection[R]
controller[R]
params[R]
renderer[W]
url[R]
Public Class Methods
for(controller:, connection:, url:, params:)
click to toggle source
# File lib/futurism/resolver/controller/renderer.rb, line 9 def self.for(controller:, connection:, url:, params:) new(controller: controller, connection: connection, url: url, params: params).renderer end
new(controller:, connection:, url:, params:)
click to toggle source
# File lib/futurism/resolver/controller/renderer.rb, line 13 def initialize(controller:, connection:, url:, params:) @controller = controller @connection = connection @url = url || "" @params = params || {} setup_env! end
Public Instance Methods
renderer()
click to toggle source
# File lib/futurism/resolver/controller/renderer.rb, line 22 def renderer @renderer ||= controller.renderer end
Private Instance Methods
recognize_url(url)
click to toggle source
# File lib/futurism/resolver/controller/renderer.rb, line 59 def recognize_url(url) HTTP_METHODS.each do |http_method| path = Rails.application.routes.recognize_path(url, method: http_method) return path if path rescue ActionController::RoutingError # Route not matched, try next end warn "We were unable to find a matching rails route for '#{url}'. " \ "This may be because there are proc-based routing constraints for this particular url, or " \ "it truly is an unrecognizable url." {} end
setup_env!()
click to toggle source
# File lib/futurism/resolver/controller/renderer.rb, line 31 def setup_env! if url.present? uri = URI.parse(url) path = ActionDispatch::Journey::Router::Utils.normalize_path(uri.path) query_hash = Rack::Utils.parse_nested_query(uri.query) path_params = recognize_url(url) # use full url to be more likely to match a url with subdomain constraints self.renderer = renderer.new( "rack.request.query_hash" => query_hash, "rack.request.query_string" => uri.query, "ORIGINAL_SCRIPT_NAME" => "", "ORIGINAL_FULLPATH" => path, Rack::SCRIPT_NAME => "", Rack::PATH_INFO => path, Rack::REQUEST_PATH => path, Rack::QUERY_STRING => uri.query, ActionDispatch::Http::Parameters::PARAMETERS_KEY => params.symbolize_keys.merge(path_params).merge(query_hash) ) end # Copy connection env to renderer to fix some RACK related issues from gems like # Warden or Devise new_env = connection.env.merge(renderer.instance_variable_get(:@env)) renderer.instance_variable_set(:@env, new_env) end