Module: ActionController::ParameterEncoding::ClassMethods

Defined in:
actionpack/lib/action_controller/metal/parameter_encoding.rb

Instance Method Summary collapse

Instance Method Details

#action_encoding_template(action) ⇒ Object

:nodoc:



18
19
20
21
22
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 18

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

#inherited(klass) ⇒ Object

:nodoc:



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

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

#param_encoding(action, param, encoding) ⇒ Object

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.



77
78
79
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 77

def param_encoding(action, param, encoding)
  @_parameter_encodings[action.to_s][param.to_s] = encoding
end

#setup_param_encodeObject

:nodoc:



14
15
16
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 14

def setup_param_encode # :nodoc:
  @_parameter_encodings = Hash.new { |h, k| h[k] = {} }
end

#skip_parameter_encoding(action) ⇒ Object

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.



48
49
50
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 48

def skip_parameter_encoding(action)
  @_parameter_encodings[action.to_s] = Hash.new { Encoding::ASCII_8BIT }
end