module RenderComponent::Components::InstanceMethods

Protected Instance Methods

render_component(options) click to toggle source

Renders the component specified as the response for the current method

# File lib/render_component/components.rb, line 38
def render_component(options) #:doc:
  component_logging(options) do
    response = component_response(options, true)[2]
    if response.redirect_url
      redirect_to response.redirect_url
    else
      render :text => response.body, :status => response.status
    end
  end
end
render_component_into_view(options) click to toggle source

Returns the component response as a string

# File lib/render_component/components.rb, line 50
def render_component_into_view(options) #:doc:
  component_logging(options) do
    response = component_response(options, false)[2]
    if redirected = response.redirect_url
      if redirected =~ %r{://}
        location = URI.parse(redirected)
        redirected = location.query ? "#{location.path}?#{location.query}" : location.path
      end
      render_component_into_view(Rails.application.routes.recognize_path(redirected, { :method => nil }))
    else
      response.body.html_safe
    end
  end
end
session_with_render_component() click to toggle source
# File lib/render_component/components.rb, line 78
def session_with_render_component
  #if defined?(@parent_controller)
  if component_request?
    @parent_controller.session
  else
    @_request.session
  end
end

Private Instance Methods

component_class(options) click to toggle source

determine the controller class for the component request

# File lib/render_component/components.rb, line 99
def component_class(options)
  if controller = options[:controller]
    controller.is_a?(Class) ? controller : "#{controller.to_s.camelize}Controller".constantize
  else
    self.class
  end
end
component_logging(options) { || ... } click to toggle source
# File lib/render_component/components.rb, line 140
def component_logging(options)
  if logger
    logger.info "Start rendering component (#{options.inspect}): "
    result = yield
    logger.info "\n\nEnd of component rendering"
    result
  else
    yield
  end
end
component_response(options, reuse_response) click to toggle source
# File lib/render_component/components.rb, line 88
def component_response(options, reuse_response)
  klass = component_class(options)
  component_request  = request_for_component(klass.controller_path, options)
  # needed ???
  #if reuse_response
    #component_request.env["action_controller.instance"].instance_variable_set :@_response, request.env["action_controller.instance"].instance_variable_get(:@_response)
  #end
  klass.process_with_components(component_request, options[:action], self)
end
forgery_whitelisted?() click to toggle source
# File lib/render_component/components.rb, line 130
def forgery_whitelisted?
  true
end
request_for_component(controller_path, options) click to toggle source

Create a new request object based on the current request. NOT IMPLEMENTED FOR RAILS 3 SO FAR: The new request inherits the session from the current request, bypassing any session options set for the component controller’s class

# File lib/render_component/components.rb, line 110
def request_for_component(controller_path, options)
  if options.is_a? Hash
    old_style_params = options.delete(:params)
    options.merge!(old_style_params) unless old_style_params.nil?

    request_params = options.symbolize_keys
    request_env = {}

    request.env.select {|key, value| key == key.upcase || key == 'rack.input'}.each {|item| request_env[item[0]] = item[1]}

    request_env['REQUEST_URI'] = url_for(options)
    request_env["PATH_INFO"] = url_for(options.merge(:only_path => true))
    request_env["action_dispatch.request.symbolized_path_parameters"] = request_params
    request_env["action_dispatch.request.parameters"] = request_params.with_indifferent_access
    request_env["warden"] = request.env["warden"] if (request.env.has_key?("warden"))
    component_request = ActionDispatch::Request.new(request_env)

    # its an internal request request forgery protection has to be disabled
    # because otherwise forgery detection might raise an error
    component_request.instance_eval do
      def forgery_whitelisted?
        true
      end
    end
    component_request
  else
    request
  end
end