diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2012-08-14 22:09:43 -0500 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2012-08-14 22:09:43 -0500 |
commit | 0d0d46222cb87032e76bad42ef812b7ee7367873 (patch) | |
tree | c8a698ff486b33c894ef5ead6966cf799781835a | |
parent | 6f7b651c3e43f43db6faebb39a4c9f99e50c3400 (diff) | |
download | rails-0d0d46222cb87032e76bad42ef812b7ee7367873.tar.gz rails-0d0d46222cb87032e76bad42ef812b7ee7367873.tar.bz2 rails-0d0d46222cb87032e76bad42ef812b7ee7367873.zip |
Add Request#formats=(extensions) that lets you set multiple formats directly in a prioritized order
-rw-r--r-- | actionpack/CHANGELOG.md | 16 | ||||
-rw-r--r-- | actionpack/lib/action_dispatch/http/mime_negotiation.rb | 21 |
2 files changed, 36 insertions, 1 deletions
diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index d674fae9d4..516fcbe62f 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,5 +1,19 @@ ## Rails 4.0.0 (unreleased) ## +* Add Request#formats=(extensions) that lets you set multiple formats directly in a prioritized order *DHH* + + Example of using this for custom iphone views with an HTML fallback: + + class ApplicationController < ActionController::Base + before_filter :adjust_format_for_iphone_with_html_fallback + + private + def adjust_format_for_iphone_with_html_fallback + request.formats = [ :iphone, :html ] if request.env["HTTP_USER_AGENT"][/iPhone/] + end + end + + * Add Routing Concerns to declare common routes that can be reused inside others resources and routes. @@ -28,7 +42,7 @@ resources :posts, concerns: [:commentable, :image_attachable] - *David Heinemeier Hansson + Rafael Mendonça França* + *DHH + Rafael Mendonça França* * Add start_hour and end_hour options to the select_hour helper. *Evan Tann* diff --git a/actionpack/lib/action_dispatch/http/mime_negotiation.rb b/actionpack/lib/action_dispatch/http/mime_negotiation.rb index e31f3b823d..0f98e84788 100644 --- a/actionpack/lib/action_dispatch/http/mime_negotiation.rb +++ b/actionpack/lib/action_dispatch/http/mime_negotiation.rb @@ -80,6 +80,27 @@ module ActionDispatch @env["action_dispatch.request.formats"] = [Mime::Type.lookup_by_extension(parameters[:format])] end + # Sets the \formats by string extensions. This differs from #format= by allowing you + # to set multiple, ordered formats, which is useful when you want to have a fallback. + # + # In this example, the :iphone format will be used if it's available, otherwise it'll fallback + # to the :html format. + # + # class ApplicationController < ActionController::Base + # before_filter :adjust_format_for_iphone_with_html_fallback + # + # private + # def adjust_format_for_iphone_with_html_fallback + # request.formats = [ :iphone, :html ] if request.env["HTTP_USER_AGENT"][/iPhone/] + # end + # end + def formats=(extensions) + parameters[:format] = extensions.first.to_s + @env["action_dispatch.request.formats"] = extensions.collect do |extension| + Mime::Type.lookup_by_extension(extension) + end + end + # Receives an array of mimes and return the first user sent mime that # matches the order array. # |