From 41ea6963a38880e47dbc1cd75dd91a1df184ba66 Mon Sep 17 00:00:00 2001
From: David Heinemeier Hansson <david@loudthinking.com>
Date: Wed, 23 Feb 2005 14:57:08 +0000
Subject: 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(-)

(limited to 'actionpack')

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:
       # * <tt>:host</tt> -- overrides the default (current) host if provided
       # * <tt>:protocol</tt> -- 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 <tt>@params</tt>.
+      # The URL is generated from the remaining keys in the hash. A URL contains two key parts: the <base> and a query string.
+      # Routes composes a query string as the key/value pairs not included in the <base>.
       # �
       # 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
-- 
cgit v1.2.3