mirror of
https://github.com/github/rails.git
synced 2026-04-04 03:00:58 -04:00
Rendering xml shouldnt happen inside any layout. Added class proxying to RJS, so you can call page.field.clear("my_field") to generate Field.clear("my_field");. Added :content_type option to render, so you can change the content type on the fly. Do type/subtype reordering of Accept header preferences for xml types (aka make Firefox work with respond_to). CHANGED DEFAULT: The default content type for .rxml is now application/xml instead of type/xml, see http://www.xml.com/pub/a/2004/07/21/dive.html for reason
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3852 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
*SVN*
|
||||
|
||||
* Added :content_type option to render, so you can change the content type on the fly [DHH]. Example: render :action => "atom.rxml", :content_type => "application/atom+xml"
|
||||
|
||||
* CHANGED DEFAULT: The default content type for .rxml is now application/xml instead of type/xml, see http://www.xml.com/pub/a/2004/07/21/dive.html for reason [DHH]
|
||||
|
||||
* Added option to render action/template/file of a specific extension (and here by template type). This means you can have multiple templates with the same name but a different extension [DHH]. Example:
|
||||
|
||||
class WeblogController < ActionController::Base
|
||||
|
||||
@@ -634,6 +634,10 @@ module ActionController #:nodoc:
|
||||
end
|
||||
end
|
||||
|
||||
if content_type = options[:content_type]
|
||||
headers["Content-Type"] = content_type
|
||||
end
|
||||
|
||||
if text = options[:text]
|
||||
render_text(text, options[:status])
|
||||
|
||||
|
||||
@@ -245,7 +245,7 @@ module ActionController #:nodoc:
|
||||
|
||||
def candidate_for_layout?(options)
|
||||
(options.has_key?(:layout) && options[:layout] != false) ||
|
||||
options.values_at(:text, :file, :inline, :partial, :nothing).compact.empty? &&
|
||||
options.values_at(:text, :xml, :file, :inline, :partial, :nothing).compact.empty? &&
|
||||
!template_exempt_from_layout?(default_template_name(options[:action] || options[:template]))
|
||||
end
|
||||
|
||||
|
||||
@@ -1,13 +1,31 @@
|
||||
module Mime
|
||||
class Type
|
||||
def self.lookup(string)
|
||||
LOOKUP[string]
|
||||
end
|
||||
|
||||
def self.parse(accept_header)
|
||||
accept_header.split(",").collect! do |mime_type|
|
||||
Mime::Type.lookup(mime_type.split(";").first.strip)
|
||||
class << self
|
||||
def lookup(string)
|
||||
LOOKUP[string]
|
||||
end
|
||||
|
||||
def parse(accept_header)
|
||||
mime_types = accept_header.split(",").collect! do |mime_type|
|
||||
mime_type.split(";").first.strip
|
||||
end
|
||||
|
||||
reorder_xml_types!(mime_types)
|
||||
mime_types.collect! { |mime_type| Mime::Type.lookup(mime_type) }
|
||||
end
|
||||
|
||||
private
|
||||
def reorder_xml_types!(mime_types)
|
||||
mime_types.delete("text/xml") if mime_types.include?("application/xml")
|
||||
|
||||
if index_for_generic_xml = mime_types.index("application/xml")
|
||||
specific_xml_types = mime_types[index_for_generic_xml..-1].grep(/application\/[a-z]*\+xml/)
|
||||
|
||||
for specific_xml_type in specific_xml_types.reverse
|
||||
mime_types.insert(index_for_generic_xml, mime_types.delete(specific_xml_type))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(string, symbol = nil, synonyms = [])
|
||||
@@ -19,6 +37,10 @@ module Mime
|
||||
@string
|
||||
end
|
||||
|
||||
def to_str
|
||||
to_s
|
||||
end
|
||||
|
||||
def to_sym
|
||||
@symbol || to_sym
|
||||
end
|
||||
@@ -39,7 +61,7 @@ module Mime
|
||||
ALL = Type.new "*/*", :all
|
||||
HTML = Type.new "text/html", :html, %w( application/xhtml+xml )
|
||||
JS = Type.new "text/javascript", :js, %w( application/javascript application/x-javascript )
|
||||
XML = Type.new "application/xml", :xml, %w( application/x-xml )
|
||||
XML = Type.new "application/xml", :xml, %w( text/xml application/x-xml )
|
||||
RSS = Type.new "application/rss+xml", :rss
|
||||
ATOM = Type.new "application/atom+xml", :atom
|
||||
YAML = Type.new "application/x-yaml", :yaml
|
||||
|
||||
@@ -406,7 +406,7 @@ module ActionView #:nodoc:
|
||||
body = case extension.to_sym
|
||||
when :rxml
|
||||
"xml = Builder::XmlMarkup.new(:indent => 2)\n" +
|
||||
"@controller.headers['Content-Type'] ||= 'text/xml'\n" +
|
||||
"@controller.headers['Content-Type'] ||= 'application/xml'\n" +
|
||||
template
|
||||
when :rjs
|
||||
"@controller.headers['Content-Type'] ||= 'text/javascript'\n" +
|
||||
|
||||
@@ -618,29 +618,33 @@ module ActionView
|
||||
end
|
||||
|
||||
private
|
||||
def page
|
||||
self
|
||||
end
|
||||
|
||||
def record(line)
|
||||
returning line = "#{line.to_s.chomp.gsub /\;$/, ''};" do
|
||||
self << line
|
||||
def page
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
def render(*options_for_render)
|
||||
Hash === options_for_render.first ?
|
||||
@context.render(*options_for_render) :
|
||||
options_for_render.first.to_s
|
||||
end
|
||||
def record(line)
|
||||
returning line = "#{line.to_s.chomp.gsub /\;$/, ''};" do
|
||||
self << line
|
||||
end
|
||||
end
|
||||
|
||||
def javascript_object_for(object)
|
||||
object.respond_to?(:to_json) ? object.to_json : object.inspect
|
||||
end
|
||||
def render(*options_for_render)
|
||||
Hash === options_for_render.first ?
|
||||
@context.render(*options_for_render) :
|
||||
options_for_render.first.to_s
|
||||
end
|
||||
|
||||
def arguments_for_call(arguments)
|
||||
arguments.map { |argument| javascript_object_for(argument) }.join ', '
|
||||
end
|
||||
def javascript_object_for(object)
|
||||
object.respond_to?(:to_json) ? object.to_json : object.inspect
|
||||
end
|
||||
|
||||
def arguments_for_call(arguments)
|
||||
arguments.map { |argument| javascript_object_for(argument) }.join ', '
|
||||
end
|
||||
|
||||
def method_missing(method, *arguments)
|
||||
JavaScriptProxy.new(self, method.to_s.camelize)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -718,7 +722,7 @@ module ActionView
|
||||
if method.to_s =~ /(.*)=$/
|
||||
assign($1, arguments.first)
|
||||
else
|
||||
call("#{method.to_s.first}#{method.to_s.classify[1..-1]}", *arguments)
|
||||
call("#{method.to_s.first}#{method.to_s.camelize[1..-1]}", *arguments)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -479,10 +479,12 @@ class ActionPackHeaderTest < Test::Unit::TestCase
|
||||
@controller = ActionPackAssertionsController.new
|
||||
@request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
|
||||
end
|
||||
|
||||
def test_rendering_xml_sets_content_type
|
||||
process :hello_xml_world
|
||||
assert_equal('text/xml', @controller.headers['Content-Type'])
|
||||
assert_equal('application/xml', @controller.headers['Content-Type'])
|
||||
end
|
||||
|
||||
def test_rendering_xml_respects_content_type
|
||||
@response.headers['Content-Type'] = 'application/pdf'
|
||||
process :hello_xml_world
|
||||
|
||||
@@ -380,4 +380,9 @@ return array.reverse();
|
||||
});
|
||||
EOS
|
||||
end
|
||||
|
||||
def test_class_proxy
|
||||
@generator.form.focus('my_field')
|
||||
assert_equal "Form.focus(\"my_field\");", @generator.to_s
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user