From c2267db383fb42e2e3c2abdbd58be6638908fb0f Mon Sep 17 00:00:00 2001 From: Angelo Capilleri Date: Sat, 22 Dec 2012 09:18:01 +0100 Subject: return Mime::NullType if format is unknown If a request has an unknown format, the methods html?, xml?, json? ...etc not raise an Exception. This patch add a class Mime::NullType, that is returned when request.format is unknown and it responds false to the methods that ends with '?' and true to 'nil?'. It refers to #7837, this issue is considered a improvement not a bug. --- actionpack/CHANGELOG.md | 5 +++++ actionpack/lib/action_dispatch/http/mime_type.rb | 13 ++++++++++++- actionpack/test/controller/send_file_test.rb | 2 +- actionpack/test/dispatch/request_test.rb | 11 ++++++++++- 4 files changed, 28 insertions(+), 3 deletions(-) (limited to 'actionpack') diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md index 88c4bea3d2..539b2eec01 100644 --- a/actionpack/CHANGELOG.md +++ b/actionpack/CHANGELOG.md @@ -1,5 +1,10 @@ ## Rails 4.0.0 (unreleased) ## +* Added `Mime::NullType` class. This allows to use html?, xml?, json?..etc when + the `format` of `request` is unknown, without raise an exception. + + *Angelo Capilleri* + * Integrate the Journey gem into Action Dispatch so that the global namespace is not polluted with names that may be used as models. diff --git a/actionpack/lib/action_dispatch/http/mime_type.rb b/actionpack/lib/action_dispatch/http/mime_type.rb index f56f09c5b3..912da741b7 100644 --- a/actionpack/lib/action_dispatch/http/mime_type.rb +++ b/actionpack/lib/action_dispatch/http/mime_type.rb @@ -27,7 +27,7 @@ module Mime class << self def [](type) return type if type.is_a?(Type) - Type.lookup_by_extension(type) + Type.lookup_by_extension(type) || NullType.new end def fetch(type) @@ -306,6 +306,17 @@ module Mime method.to_s.ends_with? '?' end end + + class NullType + def nil? + true + end + + private + def method_missing(method, *args) + false if method.to_s.ends_with? '?' + end + end end require 'action_dispatch/http/mime_types' diff --git a/actionpack/test/controller/send_file_test.rb b/actionpack/test/controller/send_file_test.rb index 5e9053da5b..8ecc1c7d73 100644 --- a/actionpack/test/controller/send_file_test.rb +++ b/actionpack/test/controller/send_file_test.rb @@ -144,7 +144,7 @@ class SendFileTest < ActionController::TestCase } @controller.headers = {} - assert_raise(ArgumentError){ @controller.send(:send_file_headers!, options) } + assert !@controller.send(:send_file_headers!, options) end def test_send_file_headers_guess_type_from_extension diff --git a/actionpack/test/dispatch/request_test.rb b/actionpack/test/dispatch/request_test.rb index 263853fb6c..4e59e214c6 100644 --- a/actionpack/test/dispatch/request_test.rb +++ b/actionpack/test/dispatch/request_test.rb @@ -591,9 +591,18 @@ class RequestTest < ActiveSupport::TestCase request = stub_request request.expects(:parameters).at_least_once.returns({ :format => :unknown }) - assert request.formats.empty? + assert_instance_of Mime::NullType, request.format end + test "format is not nil with unknown format" do + request = stub_request + request.expects(:parameters).at_least_once.returns({ format: :hello }) + assert_equal request.format.nil?, true + assert_equal request.format.html?, false + assert_equal request.format.xml?, false + assert_equal request.format.json?, false + end + test "formats with xhr request" do request = stub_request 'HTTP_X_REQUESTED_WITH' => "XMLHttpRequest" request.expects(:parameters).at_least_once.returns({}) -- cgit v1.2.3