aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-02-23 14:57:08 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-02-23 14:57:08 +0000
commit41ea6963a38880e47dbc1cd75dd91a1df184ba66 (patch)
treec1438c5d500d19a0887df329bd4dd98f5b36c530
parenta8f36e88dd322f78efe0a54eb73a7e3b9fd60479 (diff)
downloadrails-41ea6963a38880e47dbc1cd75dd91a1df184ba66.tar.gz
rails-41ea6963a38880e47dbc1cd75dd91a1df184ba66.tar.bz2
rails-41ea6963a38880e47dbc1cd75dd91a1df184ba66.zip
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
-rw-r--r--actionpack/CHANGELOG2
-rwxr-xr-xactionpack/lib/action_controller/base.rb12
-rwxr-xr-xactionpack/test/controller/redirect_test.rb54
-rw-r--r--actionpack/test/controller/render_test.rb11
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:
# * <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