From 41ea6963a38880e47dbc1cd75dd91a1df184ba66 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 23 Feb 2005 14:57:08 +0000 Subject: [PATCH] Added Base#render_to_string to parse a template and get the result back as a string #479 git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@766 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 + actionpack/lib/action_controller/base.rb | 12 +++-- actionpack/test/controller/redirect_test.rb | 54 +++++++++------------ actionpack/test/controller/render_test.rb | 11 +++++ 4 files changed, 44 insertions(+), 35 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 1528b0e8b8..8a09af333a 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added Base#render_to_string to parse a template and get the result back as a string #479 + * Fixed that send_file/data can work even if render* has been called before in action processing to render the content of a file to be send for example #601 * Added FormOptionsHelper#time_zone_select and FormOptionsHelper#time_zone_options_for_select to work with the new value object TimeZone in Active Record #688 [Jamis Buck] diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index fa7380f9b5..8b02731510 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -341,10 +341,8 @@ module ActionController #:nodoc: # * :host -- overrides the default (current) host if provided # * :protocol -- overrides the default (current) protocol if provided #   - # All other keys are used to generate an appropriate path for the new URL. This is handled by the Routes mechanism, - # and the generated path is wildly configurable. The options that Routes does not use are - # are encoded into a typical query string. Once (and if) the link is followed, all provided options are made - # available to the controller in @params. + # The URL is generated from the remaining keys in the hash. A URL contains two key parts: the and a query string. + # Routes composes a query string as the key/value pairs not included in the . #   # The default Routes setup supports a typical Rails path of "controller/action/id" where action and id are optional, with # action defaulting to 'index' when not given. Here are some typical url_for statements and their corresponding URLs: @@ -478,6 +476,12 @@ module ActionController #:nodoc: render_text "", status end + # Returns the result of the render as a string. + def render_to_string(template_name = default_template_name) + add_variables_to_assigns + @template.render_file(template_name) + end + # Sends the file by streaming it 4096 bytes at a time. This way the # whole file doesn't need to be read into memory at once. This makes # it feasible to send even large files. diff --git a/actionpack/test/controller/redirect_test.rb b/actionpack/test/controller/redirect_test.rb index 6302016a53..6ae26b739d 100755 --- a/actionpack/test/controller/redirect_test.rb +++ b/actionpack/test/controller/redirect_test.rb @@ -1,44 +1,36 @@ require File.dirname(__FILE__) + '/../abstract_unit' -class RedirectTest < Test::Unit::TestCase - class RedirectController < ActionController::Base - def simple_redirect - redirect_to :action => "hello_world" - end - - def method_redirect - redirect_to :dashbord_url, 1, "hello" - end - - def rescue_errors(e) raise e end - - protected - def dashbord_url(id, message) - url_for :action => "dashboard", :params => { "id" => id, "message" => message } - end +class RedirectController < ActionController::Base + def simple_redirect + redirect_to :action => "hello_world" end + + def method_redirect + redirect_to :dashbord_url, 1, "hello" + end + + def rescue_errors(e) raise e end + + protected + def dashbord_url(id, message) + url_for :action => "dashboard", :params => { "id" => id, "message" => message } + end +end +class RedirectTest < Test::Unit::TestCase def setup - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new + @controller = RedirectController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new end def test_simple_redirect - @request.path = "/redirect/simple_redirect" - @request.action = "simple_redirect" - response = process_request - assert_equal "http://test.host/redirect/hello_world", response.headers["location"] + get :simple_redirect + assert_redirect_url "http://test.host/redirect/hello_world" end def test_redirect_with_method_reference_and_parameters - @request.path = "/redirect/method_redirect" - @request.action = "method_redirect" - response = process_request - assert_equal "http://test.host/redirect/dashboard?message=hello&id=1", response.headers["location"] + get :method_redirect + assert_redirect_url "http://test.host/redirect/dashboard?message=hello&id=1" end - - private - def process_request - RedirectController.process(@request, @response) - end end \ No newline at end of file diff --git a/actionpack/test/controller/render_test.rb b/actionpack/test/controller/render_test.rb index afffd15793..e471139d8f 100644 --- a/actionpack/test/controller/render_test.rb +++ b/actionpack/test/controller/render_test.rb @@ -59,6 +59,11 @@ class TestController < ActionController::Base render_action "list" end + def hello_in_a_string + @customers = [ Customer.new("david"), Customer.new("mary") ] + render_text "How's there? #{render_to_string("test/list")}" + end + def rescue_action(e) raise end private @@ -71,6 +76,7 @@ class TestController < ActionController::Base end TestController.template_root = File.dirname(__FILE__) + "/../fixtures/" +Fun::GamesController.template_root = File.dirname(__FILE__) + "/../fixtures/" class TestLayoutController < ActionController::Base layout "layouts/standard" @@ -175,6 +181,11 @@ class RenderTest < Test::Unit::TestCase assert_equal "Hello: davidHello: mary", process_request.body end + def test_render_to_string + @request.action = "hello_in_a_string" + assert_equal "How's there? Hello: davidHello: mary", process_request.body + end + def test_nested_rendering @request.action = "hello_world" assert_equal "Living in a nested world", Fun::GamesController.process(@request, @response).body