Class Mime::Type
In: actionpack/lib/action_controller/mime_type.rb
Parent: Object

Encapsulates the notion of a mime type. Can be used at render time, for example, with:

  class PostsController < ActionController::Base
    def show
      @post = Post.find(params[:id])

      respond_to do |format|
        format.html
        format.ics { render :text => post.to_ics, :mime_type => Mime::Type["text/calendar"]  }
        format.xml { render :xml => @people.to_xml }
      end
    end
  end

Methods

==   ===   lookup   lookup_by_extension   method_missing   new   parse   register   register_alias   to_s   to_str   to_sym  

Public Class methods

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 47
      def lookup(string)
        LOOKUP[string]
      end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 51
      def lookup_by_extension(extension)
        EXTENSION_LOOKUP[extension]
      end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 122
    def initialize(string, symbol = nil, synonyms = [])
      @symbol, @synonyms = symbol, synonyms
      @string = string
    end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 70
      def parse(accept_header)
        # keep track of creation order to keep the subsequent sort stable
        list = []
        accept_header.split(/,/).each_with_index do |header, index| 
          params = header.split(/;\s*q=/)
          list << AcceptItem.new(index, *params) unless params.empty?
        end
        list.sort!

        # Take care of the broken text/xml entry by renaming or deleting it
        text_xml = list.index("text/xml")
        app_xml = list.index(Mime::XML.to_s)

        if text_xml && app_xml
          # set the q value to the max of the two
          list[app_xml].q = [list[text_xml].q, list[app_xml].q].max

          # make sure app_xml is ahead of text_xml in the list
          if app_xml > text_xml
            list[app_xml], list[text_xml] = list[text_xml], list[app_xml]
            app_xml, text_xml = text_xml, app_xml
          end

          # delete text_xml from the list
          list.delete_at(text_xml)

        elsif text_xml
          list[text_xml].name = Mime::XML.to_s
        end

        # Look for more specific xml-based types and sort them ahead of app/xml

        if app_xml
          idx = app_xml
          app_xml_type = list[app_xml]

          while(idx < list.length)
            type = list[idx]
            break if type.q < app_xml_type.q
            if type.name =~ /\+xml$/
              list[app_xml], list[idx] = list[idx], list[app_xml]
              app_xml = idx
            end
            idx += 1
          end
        end

        list.map! { |i| Mime::Type.lookup(i.name) }.uniq!
        list
      end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 61
      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 } unless skip_lookup
        ([symbol.to_s] + extension_synonyms).each { |ext| EXTENSION_LOOKUP[ext] = SET.last }
      end

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.

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 57
      def register_alias(string, symbol, extension_synonyms = [])
        register(string, symbol, [], extension_synonyms, true)
      end

Public Instance methods

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 147
    def ==(mime_type)
      (@synonyms + [ self ]).any? { |synonym| synonym.to_s == mime_type.to_s } if mime_type
    end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 139
    def ===(list)
      if list.is_a?(Array)
        (@synonyms + [ self ]).any? { |synonym| list.include?(synonym) }
      else
        super
      end
    end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 127
    def to_s
      @string
    end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 131
    def to_str
      to_s
    end

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 135
    def to_sym
      @symbol || @string.to_sym
    end

Private Instance methods

[Source]

# File actionpack/lib/action_controller/mime_type.rb, line 152
      def method_missing(method, *args)
        if method.to_s =~ /(\w+)\?$/
          mime_type = $1.downcase.to_sym
          mime_type == @symbol || (mime_type == :html && @symbol == :all)
        else
          super
        end
      end

[Validate]