Module: ActionDispatch::Http::MimeNegotiation
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Included In:
| |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
::ActiveSupport::Concern
|
|
Defined in: | actionpack/lib/action_dispatch/http/mime_negotiation.rb |
Constant Summary
-
BROWSER_LIKE_ACCEPTS =
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 148/,\s*\*\/\*|\*\/\*\s*,/
Class Method Summary
::ActiveSupport::Concern - Extended
Instance Attribute Summary
- #formats rw
-
#formats=(extensions)
rw
Sets the formats by string extensions.
- #variant rw
-
#variant=(variant)
rw
Sets the variant for template.
Instance Method Summary
-
#accepts
Returns the accepted MIME type for the request.
-
#content_mime_type
The MIME type of the HTTP request, such as
Mime::XML
. - #content_type
-
#format(view_path = [])
Returns the MIME type for the format used in the request.
-
#format=(extension)
Sets the format by string extension, which can be used to force custom formats that are not controlled by the extension.
-
#negotiate_mime(order)
Receives an array of mimes and return the first user sent mime that matches the order array.
DSL Calls
included
[ GitHub ]8 9 10 11
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 8
included do mattr_accessor :ignore_accept_header self.ignore_accept_header = false end
Instance Attribute Details
#formats (rw)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 56
def formats @env["action_dispatch.request.formats"] ||= begin params_readable = begin parameters[:format] rescue ActionController::BadRequest false end v = if params_readable Array(Mime[parameters[:format]]) elsif use_accept_header && valid_accept_header accepts elsif xhr? [Mime::JS] else [Mime::HTML] end v.select do |format| format.symbol || format.ref == "*/*" end end end
#formats=(extensions) (rw)
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_action :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
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 124
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
#variant (rw)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 13
attr_reader :variant
#variant=(variant) (rw)
Sets the variant for template.
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 81
def variant=(variant) if variant.is_a?(Symbol) @variant = [variant] elsif variant.nil? || variant.is_a?(Array) && variant.any? && variant.all?{ |v| v.is_a?(Symbol) } @variant = variant else raise ArgumentError, "request.variant must be set to a Symbol or an Array of Symbols, not a #{variant.class}. " \ "For security reasons, never directly set the variant to a user-provided value, " \ "like params[:variant].to_sym. Check user-provided value against a whitelist first, " \ "then set the variant: request.variant = :tablet if params[:variant] == 'tablet'" end end
Instance Method Details
#accepts
Returns the accepted MIME type for the request.
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 34
def accepts @env["action_dispatch.request.accepts"] ||= begin header = @env['HTTP_ACCEPT'].to_s.strip if header.empty? [content_mime_type] else Mime::Type.parse(header) end end end
#content_mime_type
The MIME type of the HTTP request, such as Mime::XML
.
For backward compatibility, the post format is extracted from the X-Post-Data-Format HTTP header if present.
#content_type
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 29
def content_type content_mime_type && content_mime_type.to_s end
#format(view_path = [])
Returns the MIME type for the format used in the request.
GET /posts/5.xml | request.format => Mime::XML
GET /posts/5.xhtml | request.format => Mime::HTML
GET /posts/5 | request.format => Mime::HTML or MIME::JS, or request.accepts.first
#format=(extension)
Sets the format by string extension, which can be used to force custom formats that are not controlled by the extension.
class ApplicationController < ActionController::Base
before_action :adjust_format_for_iphone
private
def adjust_format_for_iphone
request.format = :iphone if request.env["HTTP_USER_AGENT"][/iPhone/]
end
end
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 105
def format=(extension) parameters[:format] = extension.to_s @env["action_dispatch.request.formats"] = [Mime::Type.lookup_by_extension(parameters[:format])] end
#negotiate_mime(order)
Receives an array of mimes and return the first user sent mime that matches the order array.