Spec-Zone.ru › Ruby on Rails 7.1

class ActionController::Parameters

Parent:
Объект

Параметры 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 для вывода события 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]

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

new(parameters = {}, logging_context = {}) Показать исходный код
# 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

Возвращает новый экземпляр 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) Show source
# 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

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

Вызывает метод суперкласса
[](key) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 665
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) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 671
def []=(key, value)
  @parameters[key] = value
end

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

as_json(options=nil) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 173
    

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

compact() Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 842
def compact
  new_instance_with_inherited_permitted_status(@parameters.compact)
end

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

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

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

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

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

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

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

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

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

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

deep_dup() Show source
# 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

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

deep_merge(other_hash, &block) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 148
    

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

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

deep_merge!(other_hash, &block) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 162
    

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

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

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

deep_transform_keys!(&block) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 802
def deep_transform_keys!(&block)
  @parameters.deep_transform_keys!(&block)
  self
end

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

delete(key, &block) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 811
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) Show source
# 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

Извлекает вложенный параметр из данного 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) Show source
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 181
    

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

each_pair() { |key, convert_hashes_to_parameters(key, value)| ... } Show source
# 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

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

Также является псевдонимом для: each
each_value() { |convert_hashes_to_parameters(key, value)| ... } Show source
# 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

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

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

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

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

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

extract!(*keys) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 748
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 976
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) # => ["ruby", "rails", "", "web"]
fetch(key, *args) { || ... } Показать исходный код
# 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

Возвращает параметр для заданного 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 864
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 310
def hash
  [self.class, @parameters, @permitted].hash
end
include?(key) Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 206
    

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

Также алиас: has_key?, key?, member?
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) Показать исходный код
# 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

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

merge!(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

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

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

Возвращает новый 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 отфильтровывается.

Вы можете объявить, что параметр должен быть массивом разрешенных скаляров, сопоставив его с пустым массивом:

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 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. Это можно использовать для передачи массового назначения. Возвращает 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 440
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 830
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 835
def reject!(&block)
  @parameters.reject!(&block)
  self
end

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

Также алиасом является: delete_if
require(key) Показать исходный код
# 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

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

При передаче одного ключа, если он существует и его связанное значение присутствует или является синглетоном 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 900
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 909
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 817
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 822
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 721
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 727
def slice!(*keys)
  @parameters.slice!(*keys)
  self
end

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

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

Возвращает безопасное представление 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"}
to_hash() Показать исходный код
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 346
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 376
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 229
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 390
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 775
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 784
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 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

Возвращает новый 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 767
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 419
def values
  to_enum(:each_value).to_a
end

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

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

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

Spec-Zone.ru

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