class ActiveSupport::ParameterFilter
Фильтр параметров Active Support
ParameterFilter заменяет значения в объекте, подобном Hash, если его ключи соответствуют одному из указанных фильтров.
Сопоставление по вложенным ключам возможно с помощью точечной нотации, например "credit_card.number".
Если фильтром задан proc, ему передаются каждый ключ и значение объекта, подобного Hash, а также любого вложенного Hashа. Затем значение или ключ можно изменить нужным образом с помощью таких методов, как String#replace.
# Replaces values with "[FILTERED]" for keys that match /password/i.
ActiveSupport::ParameterFilter.new([:password])
# Replaces values with "[FILTERED]" for keys that match /foo|bar/i.
ActiveSupport::ParameterFilter.new([:foo, "bar"])
# Replaces values for the exact key "pin" and for keys that begin with
# "pin_". Does not match keys that otherwise include "pin" as a
# substring, such as "shipping_id".
ActiveSupport::ParameterFilter.new([/\Apin\z/, /\Apin_/])
# Replaces the value for :code in `{ credit_card: { code: "xxxx" } }`.
# Does not change `{ file: { code: "xxxx" } }`.
ActiveSupport::ParameterFilter.new(["credit_card.code"])
# Reverses values for keys that match /secret/i.
ActiveSupport::ParameterFilter.new([-> (k, v) do
v.reverse! if /secret/i.match?(k)
end])
Публичные методы класса
# File activesupport/lib/active_support/parameter_filter.rb, line 77 def initialize(filters = [], mask: FILTERED) @mask = mask compile_filters!(filters) end
Создаёт экземпляр с заданными фильтрами. Поддерживаются фильтры типов String, Regexp и Proc. Фильтры других типов рассматриваются как String с использованием to_s. Для фильтров Proc в аргументы блока передаются ключ, значение и необязательный исходный хеш.
Параметры
-
:mask— объект, которым заменяется отфильтрованное значение. По умолчанию используется"[FILTERED]".
# File activesupport/lib/active_support/parameter_filter.rb, line 55
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 Предварительно компилирует массив фильтров, которые в противном случае передавались бы непосредственно в initialize. В зависимости от количества и типов фильтров предварительная компиляция может повысить производительность фильтрации, особенно если сам экземпляр ParameterFilter нельзя сохранить (но предварительно скомпилированные фильтры сохранить можно).
filters = [/foo/, :bar, "nested.baz", /nested\.qux/] precompiled = ActiveSupport::ParameterFilter.precompile_filters(filters) # => [/(?-mix:foo)|(?i:bar)/, /(?i:nested\.baz)|(?-mix:nested\.qux)/] ActiveSupport::ParameterFilter.new(precompiled)
Публичные методы экземпляра
# File activesupport/lib/active_support/parameter_filter.rb, line 83 def filter(params) @no_filters ? params.dup : call(params) end
Маскирует значение params, если ключ соответствует одному из фильтров.
# File activesupport/lib/active_support/parameter_filter.rb, line 88 def filter_param(key, value) @no_filters ? value : value_for_key(key, value) end
Возвращает отфильтрованное значение для заданного ключа. Для фильтров Proc третий аргумент блока не заполняется.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.