Spec-Zone.ru › Ruby on Rails 7.2

класс ActionController::Parameters

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

Контроллер действия Parameters

Позволяет выбрать, какие атрибуты должны быть разрешены для массового обновления и тем самым предотвратить случайное раскрытие конфиденциальных данных. Предоставляет два метода для этой цели: 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 для отправки события ActiveSupport::Notifications.instrument по теме unpermitted_parameters.action_controller и записи в журнал на уровне 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

Обратите внимание, что эти параметры не являются потокобезопасными. В многопоточной среде их следует устанавливать только один раз во время запуска и никогда не изменять во время выполнения.

Вы можете получить значения ActionController::Parameters, используя либо :key , либо "key".

params = ActionController::Parameters.new(key: "value")
params[:key]  # => "value"
params["key"] # => "value"

Константы

PERMITTED_SCALAR_TYPES

— Фильтрация ———————————————————-

Это список разрешенных скалярных типов, включающий типы, поддерживаемые в XML и JSON запросах.

В частности, этот список используется для фильтрации обычных запросов, String является первым элементом для быстрого исключения распространённого случая.

Если вы изменяете этот список, пожалуйста, обновите соответствующий список в документации метода permit.

Атрибуты

parameters[R]
permitted[W]

Публичные методы класса

allow_deprecated_parameters_hash_equality() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 253
      def allow_deprecated_parameters_hash_equality
        ActionController.deprecator.warn <<-WARNING.squish
          `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality` is
          deprecated and will be removed in Rails 8.0.
        WARNING
      end
allow_deprecated_parameters_hash_equality=(value) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 260
      def allow_deprecated_parameters_hash_equality=(value)
        ActionController.deprecator.warn <<-WARNING.squish
          `Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality`
          is deprecated and will be removed in Rails 8.0.
        WARNING
      end
new(parameters = {}, logging_context = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 288
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

Возвращает новый 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">

Публичные методы экземпляра

==(other) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 302
def ==(other)
  if other.respond_to?(:permitted?)
    permitted? == other.permitted? && parameters == other.parameters
  else
    super
  end
end

Возвращает true, если другой объект Parameters содержит то же содержимое и разрешенный флаг.

Вызывает метод суперкласса
[](key) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 670
def [](key)
  convert_hashes_to_parameters(key, @parameters[key])
end

Возвращает параметр для заданного key. Если не найден, возвращает nil.

params = ActionController::Parameters.new(person: { name: "Francesco" })
params[:person] # => #<ActionController::Parameters {"name"=>"Francesco"} permitted: false>
params[:none]   # => nil
[]=(key, value) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 676
def []=(key, value)
  @parameters[key] = value
end

Присваивает значение заданному key. Заданный ключ может быть отфильтрован при вызове permit.

as_json(options=nil) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 181
    

Возвращает хэш, который может быть использован в качестве JSON-представления для параметров.

compact() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 847
def compact
  new_instance_with_inherited_permitted_status(@parameters.compact)
end

Возвращает новый экземпляр ActionController::Parameters с удаленными значениями nil.

compact!() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 853
def compact!
  self if @parameters.compact!
end

Удаляет все значения nil на месте и возвращает self, или nil, если изменений не было.

compact_blank() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 859
def compact_blank
  reject { |_k, v| v.blank? }
end

Возвращает новый экземпляр ActionController::Parameters без пустых значений. Использует Object#blank? для определения того, является ли значение пустым.

compact_blank!() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 865
def compact_blank!
  reject! { |_k, v| v.blank? }
end

Удаляет все пустые значения на месте и возвращает self. Использует Object#blank? для определения того, является ли значение пустым.

converted_arrays() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 436
def converted_arrays
  @converted_arrays ||= Set.new
end

Атрибут, отслеживающий преобразованные массивы (если таковые имеются), чтобы избежать двойного цикла в распространенном случае permit + массовое присваивание. Определен в методе для создания экземпляра только при необходимости.

Testing членство всё ещё использует цикл, но он будет быстрее, чем наш собственный цикл, который преобразует значения. Кроме того, мы не будем создавать новый объект массива для каждого извлечения.

deep_dup() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 965
def deep_dup
  self.class.new(@parameters.deep_dup, @logging_context).tap do |duplicate|
    duplicate.permitted = @permitted
  end
end

Возвращает дублирующий экземпляр ActionController::Parameters с теми же разрешенными параметрами.

deep_merge(other_hash, &block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 155
    

Возвращает новый экземпляр ActionController::Parameters со значениями self и other_hash рекурсивно объединенными.

Как и с Hash#merge в стандартной библиотеке, для объединения значений может быть предоставлен блок.

deep_merge!(other_hash, &block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 170
    

То же, что и #deep_merge, но изменяет self.

deep_transform_keys(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 797
def deep_transform_keys(&block)
  new_instance_with_inherited_permitted_status(
    _deep_transform_keys_in_object(@parameters, &block).to_unsafe_h
  )
end

Возвращает новый экземпляр ActionController::Parameters с результатами выполнения block один раз для каждого ключа. Это включает ключи из корневого хэша и из всех вложенных хэшей и массивов. Значения не изменяются.

deep_transform_keys!(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 806
def deep_transform_keys!(&block)
  @parameters = _deep_transform_keys_in_object(@parameters, &block).to_unsafe_h
  self
end

Возвращает тот же экземпляр ActionController::Parameters с измененными ключами. Это включает ключи из корневого хэша и из всех вложенных хэшей и массивов. Значения не изменяются.

delete(key, &block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 815
def delete(key, &block)
  convert_value_to_parameters(@parameters.delete(key, &block))
end

Удаляет пару ключ-значение из Parameters и возвращает значение. Если key не найден, возвращает nil (или, с необязательным блоком кода, передает key и возвращает результат). Этот метод похож на extract!, который возвращает соответствующий объект ActionController::Parameters.

delete_if(&block)
Псевдоним для: reject!
dig(*keys) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 714
def dig(*keys)
  convert_hashes_to_parameters(keys.first, @parameters[keys.first])
  @parameters.dig(*keys)
end

Извлекает вложенный параметр из заданного keys путем вызова dig на каждом шаге. Возвращает 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
each(&block)
Псевдоним для: each_pair
each_key(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 189
    

Вызывает блок один раз для каждого ключа в параметрах, передавая ключ. Если блок не задан, вместо него возвращается перечислитель.

each_pair() { |key, convert_hashes_to_parameters(key, value)| ... } Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 403
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

Преобразует все хэши в значения в параметры, затем передает каждую пару так же, как Hash#each_pair.

Также является псевдонимом для: each
each_value() { |convert_hashes_to_parameters(key, value)| ... } Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 415
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

Преобразует все хэши в значения в параметры, затем передает каждое значение так же, как Hash#each_value.

empty?() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 198
    

Возвращает true, если параметры не содержат пар ключ/значение.

eql?(other) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 310
def eql?(other)
  self.class == other.class &&
    permitted? == other.permitted? &&
    parameters.eql?(other.parameters)
end
except(*keys) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 742
def except(*keys)
  new_instance_with_inherited_permitted_status(@parameters.except(*keys))
end

Возвращает новый 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
exclude?(key) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 206
    

Возвращает true, если указанный ключ отсутствует в параметрах.

extract!(*keys) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 752
def extract!(*keys)
  new_instance_with_inherited_permitted_status(@parameters.extract!(*keys))
end

Удаляет и возвращает пары ключ/значение, соответствующие заданным ключам.

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>
extract_value(key, delimiter: "_") Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 983
def extract_value(key, delimiter: "_")
  @parameters[key]&.split(delimiter, -1)
end

Возвращает значение параметра для заданного 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, delimiter: ",") # => ["ruby", "rails", "", "web"]
fetch(key, *args) { || ... } Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 693
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

Возвращает параметр для заданного 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"
has_key?
Псевдоним для: include?
has_value?(value) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 870
def has_value?(value)
  each_value.include?(convert_value_to_parameters(value))
end

Возвращает true, если заданное значение присутствует для некоторого ключа в параметрах.

Также алиасируется как: value?
hash() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 316
def hash
  [self.class, @parameters, @permitted].hash
end
include?(key) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 214
    

Возвращает true, если заданный ключ присутствует в параметрах.

Также алиасируется как: has_key?, key?, member?
inspect() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 928
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 222
    

Возвращает новый массив ключей параметров.

member?
Псевдоним для: include?
merge(other_hash) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 884
def merge(other_hash)
  new_instance_with_inherited_permitted_status(
    @parameters.merge(other_hash.to_h)
  )
end

Возвращает новый ActionController::Parameters экземпляр со всеми ключами из other_hash, объединенными в текущий хеш.

merge!(other_hash) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 895
def merge!(other_hash, &block)
  @parameters.merge!(other_hash.to_h, &block)
  self
end

Возвращает текущий ActionController::Parameters экземпляр с other_hash, объединенными в текущий хеш.

permit(*filters) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 648
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

Возвращает новый 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, NilClass, Numeric, TrueClass, FalseClass, Date, Time, DateTime, StringIO, IO, ActionDispatch::Http::UploadedFile или Rack::Test::UploadedFile. В противном случае ключ :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"}}}
permit!() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 462
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. Это можно использовать для массового назначения. Возвращает 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">
permitted?() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 446
def permitted?
  @permitted
end

Возвращает true , если параметр разрешен, false в противном случае.

params = ActionController::Parameters.new
params.permitted? # => false
params.permit!
params.permitted? # => true
reject(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 834
def reject(&block)
  new_instance_with_inherited_permitted_status(@parameters.reject(&block))
end

Возвращает новый ActionController::Parameters экземпляр со всеми элементами, для которых блок возвращает true, удаленными.

reject!(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 839
def reject!(&block)
  @parameters.reject!(&block)
  self
end

Удаляет элементы, для которых блок возвращает true, и возвращает self.

Также алиасирован как: delete_if
require(key) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 522
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

Этот метод принимает как одиночный ключ, так и массив ключей.

При передаче одного ключа, если он существует, а его связанное значение присутствует или является единственным 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
required(key)
Псевдоним для: require
reverse_merge(other_hash) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 906
def reverse_merge(other_hash)
  new_instance_with_inherited_permitted_status(
    other_hash.to_h.merge(@parameters)
  )
end

Возвращает новый ActionController::Parameters экземпляр со всеми ключами из текущего хэша, объединенными в other_hash.

Также алиасирован как: with_defaults
reverse_merge!(other_hash) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 915
def reverse_merge!(other_hash)
  @parameters.merge!(other_hash.to_h) { |key, left, right| left }
  self
end

Возвращает текущий ActionController::Parameters экземпляр с текущим хэшем, объединенным в other_hash.

Также алиасирован как: with_defaults!
select(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 821
def select(&block)
  new_instance_with_inherited_permitted_status(@parameters.select(&block))
end

Возвращает новый ActionController::Parameters экземпляр только с элементами, для которых блок возвращает true.

select!(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 826
def select!(&block)
  @parameters.select!(&block)
  self
end

Эквивалентно Hash#keep_if, но возвращает nil если изменений не было.

Также алиасирован как: keep_if
slice(*keys) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 725
def slice(*keys)
  new_instance_with_inherited_permitted_status(@parameters.slice(*keys))
end

Возвращает новый 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>
slice!(*keys) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 731
def slice!(*keys)
  @parameters.slice!(*keys)
  self
end

Возвращает текущий ActionController::Parameters экземпляр, содержащий только указанные keys.

to_h(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 332
def to_h(&block)
  if permitted?
    convert_parameters_to_hashes(@parameters, :to_h, &block)
  else
    raise UnfilteredParameters
  end
end

Возвращает безопасное представление параметров ActiveSupport::HashWithIndifferentAccess со всеми неразрешенными ключами, удаленными.

"key=value"
to_hash() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 352
def to_hash
  to_h.to_hash
end

Возвращает безопасное представление параметров 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"}
to_param(*args)
Псевдоним для: to_query
to_query(*args) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 382
def to_query(*args)
  to_h.to_query(*args)
end

Возвращает строковое представление получателя, подходящее для использования в качестве строки запроса 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
to_s() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 237
delegate :keys, :empty?, :exclude?, :include?,
  :as_json, :to_s, :each_key, to: :@parameters

Возвращает содержимое параметров в виде строки.

to_unsafe_h() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 396
def to_unsafe_h
  convert_parameters_to_hashes(@parameters, :to_unsafe_h)
end

Возвращает небезопасное, неотфильтрованное представление параметров 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
to_unsafe_hash()
Псевдоним для: to_unsafe_h
transform_keys(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 779
def transform_keys(&block)
  return to_enum(:transform_keys) unless block_given?
  new_instance_with_inherited_permitted_status(
    @parameters.transform_keys(&block)
  )
end

Возвращает новый ActionController::Parameters экземпляр с результатами выполнения block для каждого ключа. Значения не изменяются.

transform_keys!(&block) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 788
def transform_keys!(&block)
  return to_enum(:transform_keys!) unless block_given?
  @parameters.transform_keys!(&block)
  self
end

Выполняет преобразование ключей и возвращает измененный ActionController::Parameters экземпляр.

END_OF_DOCUMENT_MARKER
transform_values() { |convert_value_to_parameters(v)| ... } Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 762
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

Возвращает новый экземпляр 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!() { |convert_value_to_parameters(v)| ... } Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 771
def transform_values!
  return to_enum(:transform_values!) unless block_given?
  @parameters.transform_values! { |v| yield convert_value_to_parameters(v) }
  self
end

Выполняет преобразование значений и возвращает измененный экземпляр ActionController::Parameters.

value?(value)
Псевдоним для: has_value?
values() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 425
def values
  to_enum(:each_value).to_a
end

Возвращает новый массив значений параметров.

values_at(*keys) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 878
def values_at(*keys)
  convert_value_to_parameters(@parameters.values_at(*keys))
end

Возвращает значения, назначенные заданным keys. Обратите внимание, что все объекты Hash будут преобразованы в ActionController::Parameters.

with_defaults(other_hash)
Псевдоним для: reverse_merge
with_defaults!(other_hash)
Псевдоним для: reverse_merge!
without(*keys)
Псевдоним для: except

Защищенные методы экземпляра

each_nested_attribute() { |v| ... } Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 996
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 992
def nested_attributes?
  @parameters.any? { |k, v| Parameters.nested_attribute?(k, v) }
end

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

Spec-Zone.ru

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