123456789_123456789_123456789_123456789_123456789_

Module: ActionController::ParameterEncoding::ClassMethods

Relationships & Source Files
Defined in: actionpack/lib/action_controller/metal/parameter_encoding.rb

Instance Attribute Summary

Instance Method Summary

Instance Attribute Details

#_parameter_encodings (readonly)

This method is for internal use only.
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 11

attr_reader :_parameter_encodings # :nodoc:

Instance Method Details

#action_encoding_template(action)

This method is for internal use only.
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 22

def action_encoding_template(action) # :nodoc:
  if @_parameter_encodings.has_key?(action.to_s)
    @_parameter_encodings[action.to_s]
  end
end

#inherited(klass)

This method is for internal use only.
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 13

def inherited(klass) # :nodoc:
  super
  klass.setup_param_encode
end

#param_encoding(action, param, encoding)

Specify the encoding for a parameter on an action. If not specified the default is UTF-8.

You can specify a binary (ASCII_8BIT) parameter with:

class RepositoryController < ActionController::Base
  # This specifies that file_path is not UTF-8 and is instead ASCII_8BIT
  param_encoding :show, :file_path, Encoding::ASCII_8BIT

  def show
    @repo = Repository.find_by_filesystem_path params[:file_path]

    # params[:repo_name] remains UTF-8 encoded
    @repo_name = params[:repo_name]
  end

  def index
    @repositories = Repository.all
  end
end

The file_path parameter on the show action would be encoded as ASCII-8BIT, but all other arguments will remain UTF-8 encoded. This is useful in the case where an application must handle data but encoding of the data is unknown, like file system data.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 83

def param_encoding(action, param, encoding)
  action = action.to_s
  param = param.to_s
  action_encodings = @_parameter_encodings[action].merge(param => encoding)

  @_parameter_encodings = ActiveSupport::Ractors.make_shareable(
    @_parameter_encodings.merge(action => action_encodings)
  )
end

#setup_param_encode

This method is for internal use only.
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 18

def setup_param_encode # :nodoc:
  @_parameter_encodings = ActiveSupport::Ractors.make_shareable(Hash.new({}))
end

#skip_parameter_encoding(action)

Specify that a given action's parameters should all be encoded as ASCII-8BIT (it "skips" the encoding default of UTF-8).

For example, a controller would use it like this:

class RepositoryController < ActionController::Base
  skip_parameter_encoding :show

  def show
    @repo = Repository.find_by_filesystem_path params[:file_path]

    # {repo_name} is guaranteed to be UTF-8, but was ASCII-8BIT, so
    # tag it as such
    @repo_name = params[:repo_name].force_encoding 'UTF-8'
  end

  def index
    @repositories = Repository.all
  end
end

The show action in the above controller would have all parameter values encoded as ASCII-8BIT. This is useful in the case where an application must handle data but encoding of the data is unknown, like file system data.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 52

def skip_parameter_encoding(action)
  @_parameter_encodings = ActiveSupport::Ractors.make_shareable(
    @_parameter_encodings.merge(action.to_s => Hash.new(Encoding::ASCII_8BIT))
  )
end