跳至内容 跳至搜索

Action Controller 参数

允许你选择哪些属性应该允许批量更新,从而防止意外公开不应该公开的内容。为此提供了两种方法:requirepermit。前者用于将参数标记为必需。后者用于将参数设置为允许,并限制哪些属性应该允许批量更新。

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 不采取任何措施。

    • :logunpermitted_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 请求中支持的类型。

此列表特别用于过滤普通请求,字符串作为第一个元素以快速短路常见情况。

如果您修改此集合,请同时更新permit文档中的集合。

属性

[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">
# 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。

# 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
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 665
def [](key)
  convert_hashes_to_parameters(key, @parameters[key])
end

[]=(键,值)

将值分配给给定的 key。当调用 permit 时,给定的键仍可能被过滤掉。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 671
def []=(key, value)
  @parameters[key] = value
end

as_json(options=nil)

返回一个哈希,可以用作参数的 JSON 表示。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 173
    

compact()

返回一个新的 ActionController::Parameters 实例,其中删除了 nil 值。

# 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

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 847
def compact!
  self if @parameters.compact!
end

compact_blank()

返回一个新的 ActionController::Parameters 实例,其中不包含空白值。使用 Object#blank? 来确定一个值是否为空。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 853
def compact_blank
  reject { |_k, v| v.blank? }
end

compact_blank!()

就地删除所有空白值并返回自身。使用 Object#blank? 来确定一个值是否为空。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 859
def compact_blank!
  reject! { |_k, v| v.blank? }
end

converted_arrays()

跟踪已转换数组的属性(如果有),以避免在常见用例许可 + 批量分配中进行双重循环。在方法中定义,以便仅在需要时对其进行实例化。

测试成员资格仍然会循环,但它会比我们自己的转换值的循环更快。此外,我们不会为每个获取操作构建一个新的数组对象。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 430
def converted_arrays
  @converted_arrays ||= Set.new
end

deep_dup()

返回一个重复的 ActionController::Parameters 实例,其中包含相同的允许参数。

# 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 实例,其中 selfother_hash 递归合并。

与标准库中的 Hash#merge 类似,可提供一个块来合并值。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 148
    

deep_merge!(other_hash, &block)

#deep_merge 相同,但会修改 self

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 162
    

deep_transform_keys(&block)

返回一个新的 ActionController::Parameters 实例,其中包含对每个键运行 block 一次的运行结果。这包括根哈希中的键以及所有嵌套哈希和数组中的键。值保持不变。

# 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 实例。这包括根哈希中的键以及所有嵌套哈希和数组中的键。值保持不变。

# 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 对象。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 811
def delete(key, &block)
  convert_value_to_parameters(@parameters.delete(key, &block))
end

delete_if(&block)

别名:reject!

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
# 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(&block)

别名:each_pair

each_key(&block)

为参数中的每个键调用一次块,传递该键。如果没有给出块,则返回枚举器。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 181
    

each_pair(&block)

将值中的所有哈希转换为参数,然后以与 Hash#each_pair 相同的方式生成每个对。

别名:each
# 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 相同的方式生成每个值。

# 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。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 190
    

eql?(other)

# 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>
别名:without
# 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。

# 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>
# 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"]
# 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"
# 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_key?

别名:include?

has_value?(value)

如果参数中某个键存在给定值,则返回 true。

别名:value?
# 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()

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 310
def hash
  [self.class, @parameters, @permitted].hash
end

include?(key)

如果参数中存在给定键,则返回 true。

别名:has_key?, key?, member?
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 206
    

inspect()

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 922
def inspect
  "#<#{self.class} #{@parameters} permitted: #{@permitted}>"
end

keep_if(&block)

别名:select!

key?

别名:include?

keys()

返回一个新的参数键数组。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 214
    

member?

别名:include?

merge(other_hash)

返回一个新的 ActionController::Parameters 实例,其中包含已合并到当前哈希中的所有 other_hash 密钥。

# 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

# 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)

如果 :nameparams 的键,且其关联值类型为 StringSymbolNilClassNumericTrueClassFalseClassDateTimeDateTimeStringIOIOActionDispatch::Http::UploadedFileRack::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"}}}
# 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">
# 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
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 440
def permitted?
  @permitted
end

reject(&block)

返回一个新的 ActionController::Parameters 实例,其中删除了块求值为 true 的项。

# 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 的项并返回自身。

也称为:delete_if
# 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

例如。

别名也为: required
# 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

required(key)

别名: require

reverse_merge(other_hash)

返回一个新的 ActionController::Parameters 实例,其中当前哈希中的所有键都合并到 other_hash 中。

别名也为: with_defaults
# 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 中。

别名也为: with_defaults!
# 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 的项。

# 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

别名:keep_if
# 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>
# 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

# 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"}
# 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"}
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 346
def to_hash
  to_h.to_hash
end

to_param(*args)

别名:to_query

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_param
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 376
def to_query(*args)
  to_h.to_query(*args)
end

to_s()

返回参数的内容作为字符串。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 229
delegate :keys, :empty?, :exclude?, :include?,
  :as_json, :to_s, :each_key, to: :@parameters

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"}
别名:to_unsafe_hash
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 390
def to_unsafe_h
  convert_parameters_to_hashes(@parameters, :to_unsafe_h)
end

to_unsafe_hash()

别名:to_unsafe_h

transform_keys(&block)

返回一个新的 ActionController::Parameters 实例,其中包含对每个键运行 block 一次的结果。值保持不变。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 775
def transform_keys(&block)
  return to_enum(:transform_keys) unless block_given?
  new_instance_with_inherited_permitted_status(
    @parameters.transform_keys(&block)
  )
end

transform_keys!(&block)

执行键转换,并返回已更改的 ActionController::Parameters 实例。

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 784
def transform_keys!(&block)
  return to_enum(:transform_keys!) unless block_given?
  @parameters.transform_keys!(&block)
  self
end

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>
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 758
def transform_values
  return to_enum(:transform_values) unless block_given?
  new_instance_with_inherited_permitted_status(
    @parameters.transform_values { |v| yield convert_value_to_parameters(v) }
  )
end

transform_values!()

执行值转换并返回已修改的 ActionController::Parameters 实例。

# 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

value?(value)

别名:has_value?

values()

返回参数值的数组。

# 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

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 872
def values_at(*keys)
  convert_value_to_parameters(@parameters.values_at(*keys))
end

with_defaults(other_hash)

别名:reverse_merge

with_defaults!(other_hash)

别名:reverse_merge!

without(*keys)

别名:except

实例受保护方法

each_nested_attribute()

# 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?()

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 985
def nested_attributes?
  @parameters.any? { |k, v| Parameters.nested_attribute?(k, v) }
end