Module: ActionController::ParameterEncoding::ClassMethods
| Relationships & Source Files | |
| Defined in: | actionpack/lib/action_controller/metal/parameter_encoding.rb |
Instance Attribute Summary
- #_parameter_encodings readonly Internal use only
Instance Method Summary
-
#param_encoding(action, param, encoding)
Specify the encoding for a parameter on an action.
-
#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).
- #action_encoding_template(action) Internal use only
- #inherited(klass) Internal use only
- #setup_param_encode Internal use only
Instance Attribute Details
#_parameter_encodings (readonly)
# File 'actionpack/lib/action_controller/metal/parameter_encoding.rb', line 11
attr_reader :_parameter_encodings # :nodoc:
Instance Method Details
#action_encoding_template(action)
# 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)
# 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.
# 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
# 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.
# 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