aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
authorYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-04-29 17:32:55 -0700
committerYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-05-01 17:31:02 -0700
commitb98e496c039b7bde4a2de9c02809e0b4ee0679ae (patch)
tree56298784a3f08d2476cc339b3465ebea707911de /actionpack
parent49834e088bf8d02a4f75793a42868f2aea8749a4 (diff)
downloadrails-b98e496c039b7bde4a2de9c02809e0b4ee0679ae.tar.gz
rails-b98e496c039b7bde4a2de9c02809e0b4ee0679ae.tar.bz2
rails-b98e496c039b7bde4a2de9c02809e0b4ee0679ae.zip
Support implicit and explicit content types
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/lib/action_controller/new_base.rb1
-rw-r--r--actionpack/lib/action_controller/new_base/content_type.rb15
-rw-r--r--actionpack/lib/action_view/template/text.rb3
-rw-r--r--actionpack/test/controller/content_type_test.rb10
-rw-r--r--actionpack/test/new_base/content_type_test.rb111
-rw-r--r--actionpack/test/new_base/test_helper.rb1
6 files changed, 139 insertions, 2 deletions
diff --git a/actionpack/lib/action_controller/new_base.rb b/actionpack/lib/action_controller/new_base.rb
index bfd8120e10..9c8a6d0216 100644
--- a/actionpack/lib/action_controller/new_base.rb
+++ b/actionpack/lib/action_controller/new_base.rb
@@ -1,4 +1,5 @@
module ActionController
+ autoload :ContentType, "action_controller/new_base/content_type"
autoload :HideActions, "action_controller/new_base/hide_actions"
autoload :Http, "action_controller/new_base/base"
autoload :Layouts, "action_controller/new_base/layouts"
diff --git a/actionpack/lib/action_controller/new_base/content_type.rb b/actionpack/lib/action_controller/new_base/content_type.rb
new file mode 100644
index 0000000000..d2206a31af
--- /dev/null
+++ b/actionpack/lib/action_controller/new_base/content_type.rb
@@ -0,0 +1,15 @@
+module ActionController
+ module ContentType
+
+ def render_to_body(options = {})
+ if content_type = options[:content_type]
+ response.content_type = content_type
+ end
+
+ ret = super
+ response.content_type ||= options[:_template].mime_type
+ ret
+ end
+
+ end
+end \ No newline at end of file
diff --git a/actionpack/lib/action_view/template/text.rb b/actionpack/lib/action_view/template/text.rb
index f81174d707..446c735ba3 100644
--- a/actionpack/lib/action_view/template/text.rb
+++ b/actionpack/lib/action_view/template/text.rb
@@ -3,7 +3,6 @@ module ActionView #:nodoc:
def render(*) self end
- def exempt_from_layout?() false end
-
+ def mime_type() Mime::HTML end
end
end
diff --git a/actionpack/test/controller/content_type_test.rb b/actionpack/test/controller/content_type_test.rb
index 7377546631..64b8b10d5b 100644
--- a/actionpack/test/controller/content_type_test.rb
+++ b/actionpack/test/controller/content_type_test.rb
@@ -1,24 +1,29 @@
require 'abstract_unit'
class ContentTypeController < ActionController::Base
+ # :ported:
def render_content_type_from_body
response.content_type = Mime::RSS
render :text => "hello world!"
end
+ # :ported:
def render_defaults
render :text => "hello world!"
end
+ # :ported:
def render_content_type_from_render
render :text => "hello world!", :content_type => Mime::RSS
end
+ # :ported:
def render_charset_from_body
response.charset = "utf-16"
render :text => "hello world!"
end
+ # :ported:
def render_nil_charset_from_body
response.charset = nil
render :text => "hello world!"
@@ -60,6 +65,7 @@ class ContentTypeTest < ActionController::TestCase
@controller.logger = Logger.new(nil)
end
+ # :ported:
def test_render_defaults
get :render_defaults
assert_equal "utf-8", @response.charset
@@ -74,24 +80,28 @@ class ContentTypeTest < ActionController::TestCase
ContentTypeController.default_charset = "utf-8"
end
+ # :ported:
def test_content_type_from_body
get :render_content_type_from_body
assert_equal "application/rss+xml", @response.content_type
assert_equal "utf-8", @response.charset
end
+ # :ported:
def test_content_type_from_render
get :render_content_type_from_render
assert_equal "application/rss+xml", @response.content_type
assert_equal "utf-8", @response.charset
end
+ # :ported:
def test_charset_from_body
get :render_charset_from_body
assert_equal Mime::HTML, @response.content_type
assert_equal "utf-16", @response.charset
end
+ # :ported:
def test_nil_charset_from_body
get :render_nil_charset_from_body
assert_equal Mime::HTML, @response.content_type
diff --git a/actionpack/test/new_base/content_type_test.rb b/actionpack/test/new_base/content_type_test.rb
new file mode 100644
index 0000000000..10a28da496
--- /dev/null
+++ b/actionpack/test/new_base/content_type_test.rb
@@ -0,0 +1,111 @@
+require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper")
+
+module ContentType
+ class BaseController < ActionController::Base2
+ def index
+ render :text => "Hello world!"
+ end
+
+ def set_on_response_obj
+ response.content_type = Mime::RSS
+ render :text => "Hello world!"
+ end
+
+ def set_on_render
+ render :text => "Hello world!", :content_type => Mime::RSS
+ end
+ end
+
+ class TestDefault < SimpleRouteCase
+ describe "a default response is HTML and UTF8"
+
+ get "/content_type/base"
+ assert_body "Hello world!"
+ assert_header "Content-Type", "text/html; charset=utf-8"
+ end
+
+ class TestSetOnResponseObj < SimpleRouteCase
+ describe "setting the content type of the response directly on the response object"
+
+ get "/content_type/base/set_on_response_obj"
+ assert_body "Hello world!"
+ assert_header "Content-Type", "application/rss+xml; charset=utf-8"
+ end
+
+ class TestSetOnRender < SimpleRouteCase
+ describe "setting the content type of the response as an option to render"
+
+ get "/content_type/base/set_on_render"
+ assert_body "Hello world!"
+ assert_header "Content-Type", "application/rss+xml; charset=utf-8"
+ end
+
+ class ImpliedController < ActionController::Base2
+ self.view_paths = [ActionView::Template::FixturePath.new(
+ "content_type/implied/i_am_html_erb.html.erb" => "Hello world!",
+ "content_type/implied/i_am_xml_erb.xml.erb" => "<xml>Hello world!</xml>",
+ "content_type/implied/i_am_html_builder.html.builder" => "xml.p 'Hello'",
+ "content_type/implied/i_am_xml_builder.xml.builder" => "xml.awesome 'Hello'"
+ )]
+
+ def i_am_html_erb() end
+ def i_am_xml_erb() end
+ def i_am_html_builder() end
+ def i_am_xml_builder() end
+ end
+
+ class TestImpliedController < SimpleRouteCase
+ describe "the template's mime type is used if no content_type is specified"
+
+ test "sets Content-Type as text/html when rendering *.html.erb" do
+ get "/content_type/implied/i_am_html_erb"
+ assert_header "Content-Type", "text/html; charset=utf-8"
+ end
+
+ test "sets Content-Type as application/xml when rendering *.xml.erb" do
+ get "/content_type/implied/i_am_xml_erb"
+ assert_header "Content-Type", "application/xml; charset=utf-8"
+ end
+
+ test "sets Content-Type as text/html when rendering *.html.builder" do
+ get "/content_type/implied/i_am_html_builder"
+ assert_header "Content-Type", "text/html; charset=utf-8"
+ end
+
+ test "sets Content-Type as application/xml when rendering *.xml.builder" do
+ get "/content_type/implied/i_am_xml_builder"
+ assert_header "Content-Type", "application/xml; charset=utf-8"
+ end
+
+ end
+end
+
+module Charset
+ class BaseController < ActionController::Base2
+ def set_on_response_obj
+ response.charset = "utf-16"
+ render :text => "Hello world!"
+ end
+
+ def set_as_nil_on_response_obj
+ response.charset = nil
+ render :text => "Hello world!"
+ end
+ end
+
+ class TestSetOnResponseObj < SimpleRouteCase
+ describe "setting the charset of the response directly on the response object"
+
+ get "/charset/base/set_on_response_obj"
+ assert_body "Hello world!"
+ assert_header "Content-Type", "text/html; charset=utf-16"
+ end
+
+ class TestSetAsNilOnResponseObj < SimpleRouteCase
+ describe "setting the charset of the response as nil directly on the response object"
+
+ get "/charset/base/set_as_nil_on_response_obj"
+ assert_body "Hello world!"
+ assert_header "Content-Type", "text/html; charset=utf-8"
+ end
+end \ No newline at end of file
diff --git a/actionpack/test/new_base/test_helper.rb b/actionpack/test/new_base/test_helper.rb
index 03af5a66a6..d41c7283b7 100644
--- a/actionpack/test/new_base/test_helper.rb
+++ b/actionpack/test/new_base/test_helper.rb
@@ -42,6 +42,7 @@ module ActionController
use ActionController::UrlFor
use ActionController::Renderer
use ActionController::Layouts
+ use ActionController::ContentType
def self.inherited(klass)
::ActionController::Base2.subclasses << klass.to_s