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])
方法
- F
- N
- P
类公共方法
new(filters = [], mask: FILTERED) 链接
使用给定的过滤器创建实例。支持的过滤器类型为 String
、Regexp
和 Proc
。其他类型的过滤器使用 to_s
作为 String
处理。对于 Proc
过滤器,键、值和可选的原始哈希传递给块参数。
选项
-
:mask
- 过滤时替换的对象。默认为"[FILTERED]"
。
来源: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/parameter_filter.rb, line 77 def initialize(filters = [], mask: FILTERED) @mask = mask compile_filters!(filters) end
precompile_filters(filters) 链接
预编译过滤器数组,否则这些过滤器将直接传递给初始化。根据过滤器的数量和类型,预编译可以提高过滤性能,尤其是在无法保留 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)
来源: 显示 | 在 GitHub 上
# 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
实例公共方法
filter(params) 链接
如果键与过滤器之一匹配,则屏蔽 params
的值。
来源: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/parameter_filter.rb, line 83 def filter(params) @no_filters ? params.dup : call(params) end
filter_param(key, value) 链接
返回给定键的过滤后的值。对于 Proc
过滤器,第三个块参数不会被填充。
来源: 显示 | 在 GitHub 上
# File activesupport/lib/active_support/parameter_filter.rb, line 88 def filter_param(key, value) @no_filters ? value : value_for_key(key, value) end