| 28 | | # |
|---|
| 29 | | # would work as well and be slightly faster. |
|---|
| | 28 | # |
|---|
| | 29 | # == When to use components |
|---|
| | 30 | # |
|---|
| | 31 | # Components should be used with care. They're significantly slower than simply splitting reusable parts into partials and |
|---|
| | 32 | # conceptually more complicated. Don't use components as a way of separating concerns inside a single application. Instead, |
|---|
| | 33 | # reserve components to those rare cases where you truly have reusable view and controller elements that can be employed |
|---|
| | 34 | # across many applications at once. |
|---|
| | 35 | # |
|---|
| | 36 | # So to repeat: Components are a special-purpose approach that can often be replaced with better use of partials and filters. |
|---|
| | 85 | end |
|---|
| | 86 | end |
|---|
| | 87 | |
|---|
| | 88 | private |
|---|
| | 89 | def component_response(options, reuse_response) |
|---|
| | 90 | klass = component_class(options) |
|---|
| | 91 | request = request_for_component(klass.controller_name, options) |
|---|
| | 92 | response = reuse_response ? @response : @response.dup |
|---|
| | 93 | |
|---|
| | 94 | klass.process(request, response, self) |
|---|
| | 95 | end |
|---|
| | 96 | |
|---|
| | 97 | # determine the controller class for the component request |
|---|
| | 98 | def component_class(options) |
|---|
| | 99 | if controller = options[:controller] |
|---|
| | 100 | controller.is_a?(Class) ? controller : "#{controller.camelize}Controller".constantize |
|---|
| | 101 | else |
|---|
| | 102 | self.class |
|---|
| | 103 | end |
|---|
| | 104 | end |
|---|
| | 105 | |
|---|
| | 106 | # Create a new request object based on the current request. |
|---|
| | 107 | # The new request inherits the session from the current request, |
|---|
| | 108 | # bypassing any session options set for the component controller's class |
|---|
| | 109 | def request_for_component(controller_name, options) |
|---|
| | 110 | request = @request.dup |
|---|
| | 111 | request.session = @request.session |
|---|
| | 112 | |
|---|
| | 113 | request.instance_variable_set( |
|---|
| | 114 | :@parameters, |
|---|
| | 115 | (options[:params] || {}).with_indifferent_access.regular_update( |
|---|
| | 116 | "controller" => controller_name, "action" => options[:action], "id" => options[:id] |
|---|
| | 117 | ) |
|---|
| | 118 | ) |
|---|
| | 119 | |
|---|
| | 120 | request |
|---|
| 77 | | end |
|---|
| 78 | | |
|---|
| 79 | | private |
|---|
| 80 | | def component_response(options, reuse_response) |
|---|
| 81 | | c_class = component_class(options) |
|---|
| 82 | | c_request = request_for_component(c_class.controller_name, options) |
|---|
| 83 | | c_response = reuse_response ? @response : @response.dup |
|---|
| 84 | | c_class.process(c_request, c_response, self) |
|---|
| 85 | | end |
|---|
| 86 | | |
|---|
| 87 | | # determine the controller class for the component request |
|---|
| 88 | | def component_class(options) |
|---|
| 89 | | if controller = options[:controller] |
|---|
| 90 | | if controller.is_a? Class |
|---|
| 91 | | controller |
|---|
| 92 | | else |
|---|
| 93 | | "#{controller.camelize}Controller".constantize |
|---|
| 94 | | end |
|---|
| | 122 | |
|---|
| | 123 | def component_logging(options) |
|---|
| | 124 | if logger |
|---|
| | 125 | logger.info "Start rendering component (#{options.inspect}): " |
|---|
| | 126 | result = yield |
|---|
| | 127 | logger.info "\n\nEnd of component rendering" |
|---|
| | 128 | result |
|---|
| 99 | | |
|---|
| 100 | | # Create a new request object based on the current request. |
|---|
| 101 | | # The new request inherits the session from the current request, |
|---|
| 102 | | # bypassing any session options set for the component controller's class |
|---|
| 103 | | def request_for_component(controller_name, options) |
|---|
| 104 | | sub_request = @request.dup |
|---|
| 105 | | sub_request.session = @request.session |
|---|
| 106 | | sub_request.instance_variable_set(:@parameters, |
|---|
| 107 | | (options[:params] || {}).with_indifferent_access.regular_update( |
|---|
| 108 | | "controller" => controller_name, "action" => options[:action], "id" => options[:id]) |
|---|
| 109 | | ) |
|---|
| 110 | | sub_request |
|---|
| 111 | | end |
|---|
| 112 | | |
|---|
| 113 | | |
|---|
| 114 | | def component_logging(options) |
|---|
| 115 | | unless logger then yield else |
|---|
| 116 | | logger.info("Start rendering component (#{options.inspect}): ") |
|---|
| 117 | | result = yield |
|---|
| 118 | | logger.info("\n\nEnd of component rendering") |
|---|
| 119 | | result |
|---|
| 120 | | end |
|---|
| 121 | | end |
|---|