From 1373991dd8feacb0c09a6115a271777810807668 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 20 Sep 2007 23:34:07 +0000 Subject: Added that render :json will automatically call .to_json unless its being passed a string [DHH] Added Mime::Type.register_alias for dealing with different formats using the same mime type [DHH] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7520 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 25 +++++++++++++++++++++++++ actionpack/lib/action_controller/base.rb | 1 + actionpack/lib/action_controller/mime_type.rb | 10 ++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 0d71df79f9..ee19d49c70 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,30 @@ *SVN* +* Added Mime::Type.register_alias for dealing with different formats using the same mime type [DHH]. Example: + + class PostsController < ApplicationController + before_filter :adjust_format_for_iphone + + def index + @posts = Post.find(:all) + + respond_to do |format| + format.html # => renders index.html.erb and uses "text/html" as the content type + format.iphone # => renders index.iphone.erb and uses "text/html" as the content type + end + end + + + private + def adjust_format_for_iphone + if request.env["HTTP_USER_AGENT"] && request.env["HTTP_USER_AGENT"][/iPhone/] + request.format = :iphone + end + end + end + +* Added that render :json will automatically call .to_json unless it's being passed a string [DHH]. + * Autolink behaves well with emails embedded in URLs. #7313 [Jeremy McAnally, tarmo] * Fixed that default layouts did not take the format into account #9564 [lifofifo] diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 9a3ab651ac..4630103119 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -826,6 +826,7 @@ module ActionController #:nodoc: render_for_text(xml.respond_to?(:to_xml) ? xml.to_xml : xml, options[:status]) elsif json = options[:json] + json = json.to_json unless json.is_a?(String) json = "#{options[:callback]}(#{json})" unless options[:callback].blank? response.content_type = Mime::JSON render_for_text(json, options[:status]) diff --git a/actionpack/lib/action_controller/mime_type.rb b/actionpack/lib/action_controller/mime_type.rb index 7c7faefa46..29b7723d76 100644 --- a/actionpack/lib/action_controller/mime_type.rb +++ b/actionpack/lib/action_controller/mime_type.rb @@ -52,12 +52,18 @@ module Mime EXTENSION_LOOKUP[extension] end - def register(string, symbol, mime_type_synonyms = [], extension_synonyms = []) + # Registers an alias that's not usd on mime type lookup, but can be referenced directly. Especially useful for + # rendering different HTML versions depending on the user agent, like an iPhone. + def register_alias(string, symbol, extension_synonyms = []) + register(string, symbol, [], extension_synonyms, true) + end + + def register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false) Mime.send :const_set, symbol.to_s.upcase, Type.new(string, symbol, mime_type_synonyms) SET << Mime.send(:const_get, symbol.to_s.upcase) - ([string] + mime_type_synonyms).each { |string| LOOKUP[string] = SET.last } + ([string] + mime_type_synonyms).each { |string| LOOKUP[string] = SET.last } unless skip_lookup ([symbol.to_s] + extension_synonyms).each { |ext| EXTENSION_LOOKUP[ext] = SET.last } end -- cgit v1.2.3