Spec-Zone.ru › Ruby on Rails 7.1

класс ActiveSupport::ParameterFilter

Родитель:
Объект

Фильтр параметров Active Support

ParameterFilter заменяет значения в объекте типа Hash если их ключи совпадают с одним из указанных фильтров.

Сопоставление по вложенным ключам возможно с использованием нотации с точкой, например "credit_card.number".

Если в качестве фильтра используется блок, каждый ключ и значение объекта типа 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])

Общедоступные методы класса

new(filters = [], mask: FILTERED) Показать исходный код
# 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. Для фильтров-блоков ключ, значение и необязательный исходный хеш передаются в аргументы блока.

Параметры

  • :mask — заменяемый объект при фильтрации. По умолчанию "[FILTERED]".

precompile_filters(filters) Показать исходный код
# 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

Предварительно компилирует массив фильтров, которые в противном случае были бы переданы непосредственно в метод инициализации. В зависимости от количества и типов фильтров, предварительная компиляция может улучшить производительность фильтрации, особенно в том случае, когда экземпляр 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)

Общедоступные методы экземпляра

filter(params) Показать исходный код
# File activesupport/lib/active_support/parameter_filter.rb, line 83
def filter(params)
  @no_filters ? params.dup : call(params)
end

Маскирует значение params если ключ совпадает с одним из фильтров.

filter_param(key, value) Показать исходный код
# File activesupport/lib/active_support/parameter_filter.rb, line 88
def filter_param(key, value)
  @no_filters ? value : value_for_key(key, value)
end

Возвращает отфильтрованное значение для данного ключа. Для фильтров-блоков третий аргумент блока не заполняется.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API