Added defaults to respond_to [DHH]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3842 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
上级 6e3e5cad
......@@ -7,7 +7,7 @@
@posts = Post.find :all
respond_to do |type|
type.html { render } # renders weblog/index.rhtml
type.html # using defaults, which will render weblog/index.rhtml
type.xml { render :action => "index.rxml" }
type.js { render :action => "index.rjs" }
end
......
......@@ -13,6 +13,13 @@ def respond_to(&block)
end
class Responder #:nodoc:
DEFAULT_BLOCKS = {
:html => 'Proc.new { render }',
:js => 'Proc.new { render :action => "#{action_name}.rjs" }',
:xml => 'Proc.new { render :action => "#{action_name}.rxml" }',
:xml_arg => 'Proc.new { render :xml => __mime_responder_arg__ }'
}
def initialize(block_binding)
@block_binding = block_binding
@mime_type_priority = eval("request.accepts", block_binding)
......@@ -22,9 +29,19 @@ def initialize(block_binding)
for mime_type in %w( all html js xml rss atom yaml )
eval <<-EOT
def #{mime_type}(&block)
def #{mime_type}(argument = nil, &block)
@order << Mime::#{mime_type.upcase}
@responses[Mime::#{mime_type.upcase}] = block
if block_given?
@responses[Mime::#{mime_type.upcase}] = block
else
if argument
eval("__mime_responder_arg__ = " + (argument.is_a?(String) ? "'" + argument + "'" : argument), @block_binding)
@responses[Mime::#{mime_type.upcase}] = eval(DEFAULT_BLOCKS[(Mime::#{mime_type.upcase}.to_sym.to_s + "_arg").to_sym], @block_binding)
else
@responses[Mime::#{mime_type.upcase}] = eval(DEFAULT_BLOCKS[Mime::#{mime_type.upcase}.to_sym], @block_binding)
end
end
end
EOT
end
......
......@@ -31,12 +31,30 @@ def just_xml
type.xml { render :text => "XML" }
end
end
def using_defaults
respond_to do |type|
type.html
type.js
type.xml
end
end
def using_argument_defaults
person_in_xml = { :name => "David" }.to_xml(:root => "person")
respond_to do |type|
type.html
type.xml(person_in_xml)
end
end
def rescue_action(e)
raise unless ActionController::MissingTemplate === e
end
end
RespondToController.template_root = File.dirname(__FILE__) + "/../fixtures/"
class MimeControllerTest < Test::Unit::TestCase
def setup
@request = ActionController::TestRequest.new
......@@ -99,4 +117,24 @@ def test_js_or_anything
get :just_xml
assert_equal 'XML', @response.body
end
def test_using_defaults
@request.env["HTTP_ACCEPT"] = "*/*"
get :using_defaults
assert_equal 'Hello world!', @response.body
@request.env["HTTP_ACCEPT"] = "text/javascript"
get :using_defaults
assert_equal "$('body').visualEffect(\"highlight\");", @response.body
@request.env["HTTP_ACCEPT"] = "application/xml"
get :using_defaults
assert_equal "<p>Hello world!</p>\n", @response.body
end
def test_using_argument_defaults
@request.env["HTTP_ACCEPT"] = "application/xml"
get :using_argument_defaults
assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<person>\n <name>David</name>\n</person>\n", @response.body
end
end
\ No newline at end of file
......@@ -184,6 +184,14 @@ def @template.name() nil end
render :action => "potential_conflicts"
end
def hello_world_from_rxml_using_action
render :action => "hello_world.rxml"
end
def hello_world_from_rxml_using_template
render :template => "test/hello_world.rxml"
end
helper NewRenderTestHelper
helper do
def rjs_helper_method(value)
......@@ -560,4 +568,13 @@ def test_yield_content_for
get :yield_content_for
assert_equal "<title>Putting stuff in the title!</title>\n\nGreat stuff!\n", @response.body
end
end
def test_overwritting_rendering_relative_file_with_extension
get :hello_world_from_rxml_using_template
assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
get :hello_world_from_rxml_using_action
assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
end
end
\ No newline at end of file
......@@ -18,14 +18,6 @@ class TestController < ActionController::Base
def hello_world
end
def hello_world_from_rxml_using_action
render :action => "hello_world.rxml"
end
def hello_world_from_rxml_using_template
render :template => "test/hello_world.rxml"
end
def render_hello_world
render "test/hello_world"
end
......@@ -251,12 +243,4 @@ def test_accessing_local_assigns_in_inline_template_with_string_keys
get :accessing_local_assigns_in_inline_template_with_string_keys, :local_name => "Local David"
assert_equal "Goodbye, Local David", @response.body
end
def test_overwritting_rendering_relative_file_with_extension
get :hello_world_from_rxml_using_template
assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
get :hello_world_from_rxml_using_action
assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
end
end
page[:body].visual_effect :highlight
\ No newline at end of file
xml.p "Hello world!"
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册