Action Controller 参数
允许你选择哪些属性应该允许批量更新,从而防止意外公开不应该公开的内容。为此提供了两种方法:require
和 permit
。前者用于将参数标记为必需。后者用于将参数设置为允许,并限制哪些属性应该允许批量更新。
params = ActionController::Parameters.new({
person: {
name: "Francesco",
age: 22,
role: "admin"
}
})
permitted = params.require(:person).permit(:name, :age)
permitted # => #<ActionController::Parameters {"name"=>"Francesco", "age"=>22} permitted: true>
permitted.permitted? # => true
Person.first.update!(permitted)
# => #<Person id: 1, name: "Francesco", age: 22, role: "user">
它提供了两个选项来控制新实例的顶级行为
-
permit_all_parameters
- 如果为true
,则默认情况下将允许所有参数。默认值为false
。 -
action_on_unpermitted_parameters
- 控制在找到未明确允许的参数时的行为。在测试和开发环境中,默认值为:log
,否则为false
。值可以是-
false
不采取任何措施。 -
:log
在unpermitted_parameters.action_controller
主题上发出ActiveSupport::Notifications.instrument
事件并在 DEBUG 级别记录。 -
:raise
引发ActionController::UnpermittedParameters
异常。
-
示例
params = ActionController::Parameters.new
params.permitted? # => false
ActionController::Parameters.permit_all_parameters = true
params = ActionController::Parameters.new
params.permitted? # => true
params = ActionController::Parameters.new(a: "123", b: "456")
params.permit(:c)
# => #<ActionController::Parameters {} permitted: true>
ActionController::Parameters.action_on_unpermitted_parameters = :raise
params = ActionController::Parameters.new(a: "123", b: "456")
params.permit(:c)
# => ActionController::UnpermittedParameters: found unpermitted keys: a, b
请注意,这些选项 *不是线程安全的*。在多线程环境中,它们应该只在启动时设置一次,并且在运行时永远不会发生变化。
你可以使用 :key
或 "key"
获取 ActionController::Parameters
的值。
params = ActionController::Parameters.new(key: "value")
params[:key] # => "value"
params["key"] # => "value"
- #
- A
- C
- D
- E
- F
- H
- I
- K
- M
- N
- P
- R
- S
- T
- V
- W
常量
允许的标量类型 | = | [字符串、符号、NilClass、数字、TrueClass、FalseClass、日期、时间、# 日期时间是日期,我们记录类型,但避免冗余检查。StringIO、IO、ActionDispatch::Http::UploadedFile、Rack::Test::UploadedFile、] |
这是一个允许的标量类型列表,其中包括 XML 和 JSON 请求中支持的类型。 此列表特别用于过滤普通请求,字符串作为第一个元素以快速短路常见情况。 如果您修改此集合,请同时更新 |
属性
[R] | 参数 | |
[W] | 允许 |
类公共方法
new(parameters = {}, logging_context = {}) 链接
返回一个新的ActionController::Parameters
实例。此外,将permitted
属性设置为ActionController::Parameters.permit_all_parameters
的默认值。
class Person < ActiveRecord::Base
end
params = ActionController::Parameters.new(name: "Francesco")
params.permitted? # => false
Person.new(params) # => ActiveModel::ForbiddenAttributesError
ActionController::Parameters.permit_all_parameters = true
params = ActionController::Parameters.new(name: "Francesco")
params.permitted? # => true
Person.new(params) # => #<Person id: nil, name: "Francesco">
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 269 def initialize(parameters = {}, logging_context = {}) parameters.each_key do |key| unless key.is_a?(String) || key.is_a?(Symbol) raise InvalidParameterKey, "all keys must be Strings or Symbols, got: #{key.class}" end end @parameters = parameters.with_indifferent_access @logging_context = logging_context @permitted = self.class.permit_all_parameters end
实例公共方法
==(其他) 链接
如果另一个 Parameters
对象包含相同的内容和允许的标志,则返回 true。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 283 def ==(other) if other.respond_to?(:permitted?) permitted? == other.permitted? && parameters == other.parameters else if self.class.allow_deprecated_parameters_hash_equality && Hash === other ActionController.deprecator.warn <<-WARNING.squish Comparing equality between `ActionController::Parameters` and a `Hash` is deprecated and will be removed in Rails 7.2. Please only do comparisons between instances of `ActionController::Parameters`. If you need to compare to a hash, first convert it using `ActionController::Parameters#new`. To disable the deprecated behavior set `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality = false`. WARNING @parameters == other else super end end end
[](键) 链接
返回给定 key
的参数。如果未找到,则返回 nil
。
params = ActionController::Parameters.new(person: { name: "Francesco" })
params[:person] # => #<ActionController::Parameters {"name"=>"Francesco"} permitted: false>
params[:none] # => nil
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 665 def [](key) convert_hashes_to_parameters(key, @parameters[key]) end
[]=(键,值) 链接
将值分配给给定的 key
。当调用 permit
时,给定的键仍可能被过滤掉。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 671 def []=(key, value) @parameters[key] = value end
as_json(options=nil) 链接
返回一个哈希,可以用作参数的 JSON 表示。
源代码:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 173
compact() 链接
返回一个新的 ActionController::Parameters
实例,其中删除了 nil
值。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 842 def compact new_instance_with_inherited_permitted_status(@parameters.compact) end
compact!() 链接
就地删除所有 nil
值并返回 self
,如果没有进行任何更改,则返回 nil
。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 847 def compact! self if @parameters.compact! end
compact_blank() 链接
返回一个新的 ActionController::Parameters
实例,其中不包含空白值。使用 Object#blank?
来确定一个值是否为空。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 853 def compact_blank reject { |_k, v| v.blank? } end
compact_blank!() 链接
就地删除所有空白值并返回自身。使用 Object#blank?
来确定一个值是否为空。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 859 def compact_blank! reject! { |_k, v| v.blank? } end
converted_arrays() 链接
跟踪已转换数组的属性(如果有),以避免在常见用例许可 + 批量分配中进行双重循环。在方法中定义,以便仅在需要时对其进行实例化。
测试成员资格仍然会循环,但它会比我们自己的转换值的循环更快。此外,我们不会为每个获取操作构建一个新的数组对象。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 430 def converted_arrays @converted_arrays ||= Set.new end
deep_dup() 链接
返回一个重复的 ActionController::Parameters
实例,其中包含相同的允许参数。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 958 def deep_dup self.class.new(@parameters.deep_dup, @logging_context).tap do |duplicate| duplicate.permitted = @permitted end end
deep_merge(other_hash, &block) 链接
返回一个新的 ActionController::Parameters
实例,其中 self
和 other_hash
递归合并。
与标准库中的 Hash#merge
类似,可提供一个块来合并值。
来源:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 148
deep_merge!(other_hash, &block) 链接
与 #deep_merge
相同,但会修改 self
。
来源:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 162
deep_transform_keys(&block) 链接
返回一个新的 ActionController::Parameters
实例,其中包含对每个键运行 block
一次的运行结果。这包括根哈希中的键以及所有嵌套哈希和数组中的键。值保持不变。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 793 def deep_transform_keys(&block) new_instance_with_inherited_permitted_status( @parameters.deep_transform_keys(&block) ) end
deep_transform_keys!(&block) 链接
返回具有已更改键的相同 ActionController::Parameters
实例。这包括根哈希中的键以及所有嵌套哈希和数组中的键。值保持不变。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 802 def deep_transform_keys!(&block) @parameters.deep_transform_keys!(&block) self end
delete(key, &block) 链接
从 Parameters
中删除一个键值对并返回该值。如果未找到 key
,则返回 nil
(或在可选代码块中,生成 key
并返回结果)。此方法类似于 extract!
,它返回相应的 ActionController::Parameters
对象。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 811 def delete(key, &block) convert_value_to_parameters(@parameters.delete(key, &block)) end
dig(*keys) 链接
通过在每个步骤调用 dig
从给定的 keys
中提取嵌套参数。如果任何中间步骤为 nil
,则返回 nil
。
params = ActionController::Parameters.new(foo: { bar: { baz: 1 } })
params.dig(:foo, :bar, :baz) # => 1
params.dig(:foo, :zot, :xyz) # => nil
params2 = ActionController::Parameters.new(foo: [10, 11, 12])
params2.dig(:foo, 1) # => 11
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 709 def dig(*keys) convert_hashes_to_parameters(keys.first, @parameters[keys.first]) @parameters.dig(*keys) end
each_key(&block) 链接
为参数中的每个键调用一次块,传递该键。如果没有给出块,则返回枚举器。
来源:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 181
each_pair(&block) 链接
将值中的所有哈希转换为参数,然后以与 Hash#each_pair
相同的方式生成每个对。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 397 def each_pair(&block) return to_enum(__callee__) unless block_given? @parameters.each_pair do |key, value| yield [key, convert_hashes_to_parameters(key, value)] end self end
each_value(&block) 链接
将值中的所有哈希转换为参数,然后以与 Hash#each_value
相同的方式生成每个值。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 409 def each_value(&block) return to_enum(:each_value) unless block_given? @parameters.each_pair do |key, value| yield convert_hashes_to_parameters(key, value) end self end
empty?() 链接
如果参数没有键/值对,则返回 true。
来源:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 190
eql?(other) 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 304 def eql?(other) self.class == other.class && permitted? == other.permitted? && parameters.eql?(other.parameters) end
except(*keys) 链接
返回一个新的 ActionController::Parameters
实例,该实例会过滤掉给定的 keys
。
params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
params.except(:a, :b) # => #<ActionController::Parameters {"c"=>3} permitted: false>
params.except(:d) # => #<ActionController::Parameters {"a"=>1, "b"=>2, "c"=>3} permitted: false>
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 738 def except(*keys) new_instance_with_inherited_permitted_status(@parameters.except(*keys)) end
exclude?(key) 链接
如果给定的键不在参数中,则返回 true。
来源:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 198
extract!(*keys) 链接
移除并返回与给定键匹配的键/值对。
params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
params.extract!(:a, :b) # => #<ActionController::Parameters {"a"=>1, "b"=>2} permitted: false>
params # => #<ActionController::Parameters {"c"=>3} permitted: false>
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 748 def extract!(*keys) new_instance_with_inherited_permitted_status(@parameters.extract!(*keys)) end
extract_value(key, delimiter: "_") 链接
返回 key
的参数值,该值由 delimiter
分隔。
params = ActionController::Parameters.new(id: "1_123", tags: "ruby,rails")
params.extract_value(:id) # => ["1", "123"]
params.extract_value(:tags, delimiter: ",") # => ["ruby", "rails"]
params.extract_value(:non_existent_key) # => nil
请注意,如果给定 key
的值包含空元素,则返回的数组将包含空字符串。
params = ActionController::Parameters.new(tags: "ruby,rails,,web")
params.extract_value(:tags) # => ["ruby", "rails", "", "web"]
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 976 def extract_value(key, delimiter: "_") @parameters[key]&.split(delimiter, -1) end
fetch(key, *args) 链接
返回给定 key
的参数。如果找不到 key
,则有几种选择:如果没有其他参数,它将引发 ActionController::ParameterMissing
错误;如果给出了第二个参数,则返回该参数(如果可能,转换为 ActionController::Parameters
的实例);如果给出了代码块,则运行该代码块并返回其结果。
params = ActionController::Parameters.new(person: { name: "Francesco" })
params.fetch(:person) # => #<ActionController::Parameters {"name"=>"Francesco"} permitted: false>
params.fetch(:none) # => ActionController::ParameterMissing: param is missing or the value is empty: none
params.fetch(:none, {}) # => #<ActionController::Parameters {} permitted: false>
params.fetch(:none, "Francesco") # => "Francesco"
params.fetch(:none) { "Francesco" } # => "Francesco"
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 688 def fetch(key, *args) convert_value_to_parameters( @parameters.fetch(key) { if block_given? yield else args.fetch(0) { raise ActionController::ParameterMissing.new(key, @parameters.keys) } end } ) end
has_value?(value) 链接
如果参数中某个键存在给定值,则返回 true。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 864 def has_value?(value) each_value.include?(convert_value_to_parameters(value)) end
hash() 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 310 def hash [self.class, @parameters, @permitted].hash end
include?(key) 链接
如果参数中存在给定键,则返回 true。
来源:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 206
inspect() 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 922 def inspect "#<#{self.class} #{@parameters} permitted: #{@permitted}>" end
keys() 链接
返回一个新的参数键数组。
来源:在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 214
merge(other_hash) 链接
返回一个新的 ActionController::Parameters
实例,其中包含已合并到当前哈希中的所有 other_hash
密钥。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 878 def merge(other_hash) new_instance_with_inherited_permitted_status( @parameters.merge(other_hash.to_h) ) end
merge!(other_hash) 链接
返回当前 ActionController::Parameters
实例,其中包含已合并到当前哈希中的 other_hash
。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 889 def merge!(other_hash, &block) @parameters.merge!(other_hash.to_h, &block) self end
permit(*filters) 链接
返回一个新的 ActionController::Parameters
实例,其中仅包含给定的 filters
,并将对象的 permitted
属性设置为 true
。这对于限制哪些属性应允许批量更新非常有用。
params = ActionController::Parameters.new(user: { name: "Francesco", age: 22, role: "admin" })
permitted = params.require(:user).permit(:name, :age)
permitted.permitted? # => true
permitted.has_key?(:name) # => true
permitted.has_key?(:age) # => true
permitted.has_key?(:role) # => false
只有允许的标量才能通过过滤器。例如,给定
params.permit(:name)
如果 :name
是 params
的键,且其关联值类型为 String
、Symbol
、NilClass
、Numeric
、TrueClass
、FalseClass
、Date
、Time
、DateTime
、StringIO
、IO
、ActionDispatch::Http::UploadedFile
或 Rack::Test::UploadedFile
,则 :name
会通过。否则,将过滤掉键 :name
。
你可以通过将其映射到一个空数组来声明参数应为允许的标量的数组
params = ActionController::Parameters.new(tags: ["rails", "parameters"])
params.permit(tags: [])
有时无法或不方便声明哈希参数的有效键或其内部结构。只需映射到一个空哈希
params.permit(preferences: {})
小心,因为这会为任意输入打开大门。在这种情况下,permit
确保返回结构中的值是允许的标量,并过滤掉其他任何内容。
你还可以对嵌套参数使用 permit
,例如
params = ActionController::Parameters.new({
person: {
name: "Francesco",
age: 22,
pets: [{
name: "Purplish",
category: "dogs"
}]
}
})
permitted = params.permit(person: [ :name, { pets: :name } ])
permitted.permitted? # => true
permitted[:person][:name] # => "Francesco"
permitted[:person][:age] # => nil
permitted[:person][:pets][0][:name] # => "Purplish"
permitted[:person][:pets][0][:category] # => nil
请注意,如果你在指向哈希的键中使用 permit
,它不会允许所有哈希。你还需要指定哈希中哪些属性应该被允许。
params = ActionController::Parameters.new({
person: {
contact: {
email: "none@test.com",
phone: "555-1234"
}
}
})
params.require(:person).permit(:contact)
# => #<ActionController::Parameters {} permitted: true>
params.require(:person).permit(contact: :phone)
# => #<ActionController::Parameters {"contact"=>#<ActionController::Parameters {"phone"=>"555-1234"} permitted: true>} permitted: true>
params.require(:person).permit(contact: [ :email, :phone ])
# => #<ActionController::Parameters {"contact"=>#<ActionController::Parameters {"email"=>"none@test.com", "phone"=>"555-1234"} permitted: true>} permitted: true>
如果你的参数指定了多个按数字索引的参数,你可以使用与允许单个项目相同的语法,允许每个数字键下的参数集相同。
params = ActionController::Parameters.new({
person: {
'0': {
email: "none@test.com",
phone: "555-1234"
},
'1': {
email: "nothing@test.com",
phone: "555-6789"
},
}
})
params.permit(person: [:email]).to_h
# => {"person"=>{"0"=>{"email"=>"none@test.com"}, "1"=>{"email"=>"nothing@test.com"}}}
如果你想指定你想要从每个数字键中获取哪些键,你可以单独指定每个键。
params = ActionController::Parameters.new({
person: {
'0': {
email: "none@test.com",
phone: "555-1234"
},
'1': {
email: "nothing@test.com",
phone: "555-6789"
},
}
})
params.permit(person: { '0': [:email], '1': [:phone]}).to_h
# => {"person"=>{"0"=>{"email"=>"none@test.com"}, "1"=>{"phone"=>"555-6789"}}}
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 642 def permit(*filters) params = self.class.new filters.flatten.each do |filter| case filter when Symbol, String permitted_scalar_filter(params, filter) when Hash hash_filter(params, filter) end end unpermitted_parameters!(params) if self.class.action_on_unpermitted_parameters params.permit! end
permit!() 链接
将 permitted
属性设置为 true
。这可用于传递批量赋值。返回 self
。
class Person < ActiveRecord::Base
end
params = ActionController::Parameters.new(name: "Francesco")
params.permitted? # => false
Person.new(params) # => ActiveModel::ForbiddenAttributesError
params.permit!
params.permitted? # => true
Person.new(params) # => #<Person id: nil, name: "Francesco">
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 456 def permit! each_pair do |key, value| Array.wrap(value).flatten.each do |v| v.permit! if v.respond_to? :permit! end end @permitted = true self end
permitted?() 链接
如果参数被允许,则返回 true
,否则返回 false
。
params = ActionController::Parameters.new
params.permitted? # => false
params.permit!
params.permitted? # => true
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 440 def permitted? @permitted end
reject(&block) 链接
返回一个新的 ActionController::Parameters
实例,其中删除了块求值为 true 的项。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 830 def reject(&block) new_instance_with_inherited_permitted_status(@parameters.reject(&block)) end
reject!(&block) 链接
删除块求值为 true 的项并返回自身。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 835 def reject!(&block) @parameters.reject!(&block) self end
require(key) 链接
此方法同时接受单个键和键数组。
当传递单个键时,如果该键存在且其关联值存在或为单例 false
,则返回所述值
ActionController::Parameters.new(person: { name: "Francesco" }).require(:person)
# => #<ActionController::Parameters {"name"=>"Francesco"} permitted: false>
否则引发 ActionController::ParameterMissing
ActionController::Parameters.new.require(:person)
# ActionController::ParameterMissing: param is missing or the value is empty: person
ActionController::Parameters.new(person: nil).require(:person)
# ActionController::ParameterMissing: param is missing or the value is empty: person
ActionController::Parameters.new(person: "\t").require(:person)
# ActionController::ParameterMissing: param is missing or the value is empty: person
ActionController::Parameters.new(person: {}).require(:person)
# ActionController::ParameterMissing: param is missing or the value is empty: person
当给定键数组时,该方法尝试按顺序要求每个键。如果成功,则返回包含各自返回值的数组
params = ActionController::Parameters.new(user: { ... }, profile: { ... })
user_params, profile_params = params.require([:user, :profile])
否则,该方法重新引发找到的第一个异常
params = ActionController::Parameters.new(user: {}, profile: {})
user_params, profile_params = params.require([:user, :profile])
# ActionController::ParameterMissing: param is missing or the value is empty: user
从技术上讲,此方法可用于获取终端值
# CAREFUL
params = ActionController::Parameters.new(person: { name: "Finn" })
name = params.require(:person).require(:name) # CAREFUL
但请考虑在某些时候必须允许这些值
def person_params
params.require(:person).permit(:name).tap do |person_params|
person_params.require(:name) # SAFER
end
end
例如。
来源: 显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 517 def require(key) return key.map { |k| require(k) } if key.is_a?(Array) value = self[key] if value.present? || value == false value else raise ParameterMissing.new(key, @parameters.keys) end end
reverse_merge(other_hash) 链接
返回一个新的 ActionController::Parameters
实例,其中当前哈希中的所有键都合并到 other_hash
中。
来源: 显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 900 def reverse_merge(other_hash) new_instance_with_inherited_permitted_status( other_hash.to_h.merge(@parameters) ) end
reverse_merge!(other_hash) 链接
返回当前 ActionController::Parameters
实例,其中当前哈希已合并到 other_hash
中。
来源: 显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 909 def reverse_merge!(other_hash) @parameters.merge!(other_hash.to_h) { |key, left, right| left } self end
select(&block) 链接
返回一个新的 ActionController::Parameters
实例,其中仅包含块求值为 true 的项。
来源: 显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 817 def select(&block) new_instance_with_inherited_permitted_status(@parameters.select(&block)) end
select!(&block) 链接
等同于 Hash#keep_if,但如果未进行任何更改,则返回 nil
。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 822 def select!(&block) @parameters.select!(&block) self end
slice(*keys) 链接
返回一个新的 ActionController::Parameters
实例,其中仅包含给定的 keys
。如果给定的 keys
不存在,则返回一个空哈希。
params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
params.slice(:a, :b) # => #<ActionController::Parameters {"a"=>1, "b"=>2} permitted: false>
params.slice(:d) # => #<ActionController::Parameters {} permitted: false>
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 721 def slice(*keys) new_instance_with_inherited_permitted_status(@parameters.slice(*keys)) end
slice!(*keys) 链接
返回当前 ActionController::Parameters
实例,其中仅包含给定的 keys
。
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 727 def slice!(*keys) @parameters.slice!(*keys) self end
to_h(&block) 链接
返回一个安全的 ActiveSupport::HashWithIndifferentAccess
参数表示形式,其中删除了所有未授权的键。
params = ActionController::Parameters.new({
name: "Senjougahara Hitagi",
oddity: "Heavy stone crab"
})
params.to_h
# => ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
safe_params = params.permit(:name)
safe_params.to_h # => {"name"=>"Senjougahara Hitagi"}
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 326 def to_h(&block) if permitted? convert_parameters_to_hashes(@parameters, :to_h, &block) else raise UnfilteredParameters end end
to_hash() 链接
返回一个安全的 Hash
参数表示形式,其中删除了所有未授权的键。
params = ActionController::Parameters.new({
name: "Senjougahara Hitagi",
oddity: "Heavy stone crab"
})
params.to_hash
# => ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
safe_params = params.permit(:name)
safe_params.to_hash # => {"name"=>"Senjougahara Hitagi"}
源代码:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 346 def to_hash to_h.to_hash end
to_query(*args) 链接
返回接收者的字符串表示形式,适合用作 URL 查询字符串
params = ActionController::Parameters.new({
name: "David",
nationality: "Danish"
})
params.to_query
# => ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
safe_params = params.permit(:name, :nationality)
safe_params.to_query
# => "name=David&nationality=Danish"
可以传递一个可选的命名空间来包含键名
params = ActionController::Parameters.new({
name: "David",
nationality: "Danish"
})
safe_params = params.permit(:name, :nationality)
safe_params.to_query("user")
# => "user%5Bname%5D=David&user%5Bnationality%5D=Danish"
符合查询字符串的字符串对 "key=value"
按升序词典顺序排列。
to_s() 链接
返回参数的内容作为字符串。
to_unsafe_h() 链接
返回参数的非安全、未过滤的 ActiveSupport::HashWithIndifferentAccess
表示形式。
params = ActionController::Parameters.new({
name: "Senjougahara Hitagi",
oddity: "Heavy stone crab"
})
params.to_unsafe_h
# => {"name"=>"Senjougahara Hitagi", "oddity" => "Heavy stone crab"}
transform_keys(&block) 链接
返回一个新的 ActionController::Parameters
实例,其中包含对每个键运行 block
一次的结果。值保持不变。
transform_keys!(&block) 链接
执行键转换,并返回已更改的 ActionController::Parameters
实例。
transform_values() 链接
返回一个新的 ActionController::Parameters
实例,其中包含对每个值运行 block
一次的结果。键保持不变。
params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
params.transform_values { |x| x * 2 }
# => #<ActionController::Parameters {"a"=>2, "b"=>4, "c"=>6} permitted: false>
transform_values!() 链接
执行值转换并返回已修改的 ActionController::Parameters
实例。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 767 def transform_values! return to_enum(:transform_values!) unless block_given? @parameters.transform_values! { |v| yield convert_value_to_parameters(v) } self end
values() 链接
返回参数值的数组。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 419 def values to_enum(:each_value).to_a end
values_at(*keys) 链接
返回已分配给给定 keys
的值。请注意,所有 Hash
对象都将转换为 ActionController::Parameters
。
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 872 def values_at(*keys) convert_value_to_parameters(@parameters.values_at(*keys)) end
实例受保护方法
each_nested_attribute() 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 989 def each_nested_attribute hash = self.class.new self.each { |k, v| hash[k] = yield v if Parameters.nested_attribute?(k, v) } hash end
nested_attributes?() 链接
来源:显示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 985 def nested_attributes? @parameters.any? { |k, v| Parameters.nested_attribute?(k, v) } end