ActiveSupport::ParameterFilter (original) (raw)
Active Support Parameter Filter¶ ↑
ParameterFilter replaces values in a Hash-like object if their keys match one of the specified filters.
Matching based on nested keys is possible by using dot notation, e.g. "credit_card.number".
If a proc is given as a filter, each key and value of the Hash-like and of any nested Hashes will be passed to it. The value or key can then be mutated as desired using methods such as String#replace.
ActiveSupport::ParameterFilter.new([:password])
ActiveSupport::ParameterFilter.new([:foo, "bar"])
ActiveSupport::ParameterFilter.new([/\Apin\z/, /\Apin_/])
ActiveSupport::ParameterFilter.new(["credit_card.code"])
ActiveSupport::ParameterFilter.new([-> (k, v) do v.reverse! if /secret/i.match?(k) end])
Methods
F
N
P
Class Public methods
new(filters = [], mask: FILTERED)Link
Create instance with given filters. Supported type of filters are String, Regexp, and Proc. Other types of filters are treated as String using to_s. For Proc filters, key, value, and optional original hash is passed to block arguments.
Options¶ ↑
:mask- A replaced object when filtered. Defaults to"[FILTERED]".
def initialize(filters = [], mask: FILTERED) @mask = mask compile_filters!(filters) end
precompile_filters(filters)Link
Precompiles an array of filters that otherwise would be passed directly to initialize. Depending on the quantity and types of filters, precompilation can improve filtering performance, especially in the case where the ParameterFilter instance itself cannot be retained (but the precompiled filters can be retained).
filters = [/foo/, :bar, "nested.baz", /nested.qux/]
precompiled = ActiveSupport::ParameterFilter.precompile_filters(filters)
ActiveSupport::ParameterFilter.new(precompiled)
def self.precompile_filters(filters) filters, patterns = filters.partition { |filter| filter.is_a?(Proc) }
patterns.map! do |pattern| pattern.is_a?(Regexp) ? pattern : "(?i:#{Regexp.escape pattern.to_s})" end
deep_patterns = patterns.extract! { |pattern| pattern.to_s.include?("\.") }
filters << Regexp.new(patterns.join("|")) if patterns.any? filters << Regexp.new(deep_patterns.join("|")) if deep_patterns.any?
filters end
Instance Public methods
filter(params)Link
Mask value of params if key matches one of filters.
def filter(params) @no_filters ? params.dup : call(params) end
filter_param(key, value)Link
Returns filtered value for given key. For Proc filters, third block argument is not populated.
def filter_param(key, value) @no_filters ? value : value_for_key(key, value) end