Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Added that requests with JavaScript as the priority mime type in the …

…accept header and no format extension in the parameters will be treated as though their format was :js when it comes to determining which template to render. This makes it possible for JS requests to automatically render action.js.rjs files without an explicit respond_to block [DHH]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8956 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 7dcd0d7d967c613f4e447ba6330e1f616b93c1a3 1 parent 18aa19c
@dhh dhh authored
View
2  actionpack/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Added that requests with JavaScript as the priority mime type in the accept header and no format extension in the parameters will be treated as though their format was :js when it comes to determining which template to render. This makes it possible for JS requests to automatically render action.js.rjs files without an explicit respond_to block [DHH]
+
* Tests for distance_of_time_in_words with TimeWithZone instances. Closes #10914 [ernesto.jimenez]
* Remove support for multivalued (e.g., '&'-delimited) cookies. [Jamis Buck]
View
23 actionpack/lib/action_view/base.rb
@@ -344,10 +344,29 @@ def file_public?(template_path)#:nodoc:
end
# symbolized version of the :format parameter of the request, or :html by default.
+ #
+ # EXCEPTION: If the :format parameter is not set, the Accept header will be examined for
+ # whether it contains the JavaScript mime type as its first priority. If that's the case,
+ # it will be used. This ensures that Ajax applications can use the same URL to support both
+ # JavaScript and non-JavaScript users.
def template_format
return @template_format if @template_format
- format = controller && controller.respond_to?(:request) && controller.request.parameters[:format]
- @template_format = format.blank? ? :html : format.to_sym
+
+ if controller && controller.respond_to?(:request)
+ parameter_format = controller.request.parameters[:format]
+ accept_format = controller.request.accepts.first
+
+ case
+ when parameter_format.blank? && accept_format != :js
+ @template_format = :html
+ when parameter_format.blank? && accept_format == :js
+ @template_format = :js
+ else
+ @template_format = parameter_format.to_sym
+ end
+ else
+ @template_format = :html
+ end
end
private
View
6 actionpack/test/controller/new_render_test.rb
@@ -550,6 +550,12 @@ def test_render_xml_with_default
assert_equal "<p>This is grand!</p>\n", @response.body
end
+ def test_render_with_default_from_accept_header
+ @request.env["HTTP_ACCEPT"] = "text/javascript"
+ get :greeting
+ assert_equal "$(\"body\").visualEffect(\"highlight\");", @response.body
+ end
+
def test_render_rjs_with_default
get :delete_with_js
assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body
View
1  actionpack/test/fixtures/test/greeting.js.rjs
@@ -0,0 +1 @@
+page[:body].visual_effect :highlight
Please sign in to comment.
Something went wrong with that request. Please try again.