diff --git a/actionpack/lib/action_controller.rb b/actionpack/lib/action_controller.rb index 340f41163d449680aa35d460ad384f4410907b8b..d434310effca6afd388a2fc2fae43d862312a71a 100755 --- a/actionpack/lib/action_controller.rb +++ b/actionpack/lib/action_controller.rb @@ -47,6 +47,10 @@ require 'action_controller/cookies' require 'action_controller/cgi_process' require 'action_controller/caching' +require 'action_controller/components' + +require 'action_view' +ActionController::Base.template_class = ActionView::Base ActionController::Base.class_eval do include ActionController::Filters @@ -60,7 +64,5 @@ include ActionController::Cookies include ActionController::Session include ActionController::Caching + include ActionController::Components end - -require 'action_view' -ActionController::Base.template_class = ActionView::Base \ No newline at end of file diff --git a/actionpack/lib/action_controller/components.rb b/actionpack/lib/action_controller/components.rb new file mode 100644 index 0000000000000000000000000000000000000000..681c7b6d9ab16a9408d5fb79647d0319060d1e22 --- /dev/null +++ b/actionpack/lib/action_controller/components.rb @@ -0,0 +1,29 @@ +module ActionController #:nodoc: + module Components #:nodoc: + def self.append_features(base) + super + base.helper { def render_component(options) @controller.send(:component_response, options).body end } + end + + protected + def render_component(options = {}) #:doc: + response = component_response(options) + render_text(response.body, response.response_code) + end + + private + def component_response(options) + component_class(options).process(component_request(options), @response) + end + + def component_class(options) + options[:controller] ? (options[:controller].camelize + "Controller").constantize : self + end + + def component_request(options) + component_request = @request.dup + component_request.send(:instance_variable_set, :@parameters, options[:params].merge({ "controller" => options[:controller], "action" => options[:action] })) + component_request + end + end +end