class ActionController::Parameters
Параметры 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.
Атрибуты
Публичные методы класса
# 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">
Публичные методы экземпляра
# 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 содержит то же самое содержимое и разрешенный флаг.
# 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
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 671 def []=(key, value) @parameters[key] = value end
Присваивает значение данному key. Заданный ключ может быть отфильтрован при вызове permit.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 173
Возвращает хэш, который может быть использован как JSON-представление для параметров.
# 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.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 847 def compact! self if @parameters.compact! end
Удаляет все значения nil на месте и возвращает self, или nil, если изменений не было.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 853
def compact_blank
reject { |_k, v| v.blank? }
end Возвращает новый экземпляр ActionController::Parameters без пустых значений. Использует Object#blank? для определения того, является ли значение пустым.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 859
def compact_blank!
reject! { |_k, v| v.blank? }
end Удаляет все пустые значения на месте и возвращает self. Использует Object#blank? для определения того, является ли значение пустым.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 430 def converted_arrays @converted_arrays ||= Set.new end
Атрибут, отслеживающий преобразованные массивы, если таковые имеются, чтобы избежать двойного цикла в распространённом случае permit + массовое присваивание. Определено в методе, чтобы создать экземпляр только в случае необходимости.
Проверка принадлежности всё ещё использует цикл, но это будет быстрее, чем наш собственный цикл, который преобразует значения. Кроме того, мы не будем создавать новый объект массива для каждого обращения.
# 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 с теми же разрешенными параметрами.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 148
Возвращает новый экземпляр ActionController::Parameters со значениями self и other_hash, рекурсивно объединёнными.
Как и с Hash#merge в стандартной библиотеке, для объединения значений можно указать блок.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 162
То же, что и #deep_merge, но изменяет self.
# 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 один раз для каждого ключа. Это включает ключи из корневого хэша и из всех вложенных хэшей и массивов. Значения не изменяются.
# 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 с изменёнными ключами. Это включает ключи из корневого хэша и из всех вложенных хэшей и массивов. Значения не изменяются.
# 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.
# 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
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 181
Вызывает блок один раз для каждого ключа в параметрах, передавая ключ. Если блок не задан, вместо этого возвращается перечислитель.
# 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.
# 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.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 190
Возвращает true, если параметры не содержат пар ключ/значение.
# 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 # 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>
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 198
Возвращает true, если заданный ключ отсутствует в параметрах.
# 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>
# 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"]
# 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"
# 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, если заданное значение присутствует для какого-либо ключа в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 310 def hash [self.class, @parameters, @permitted].hash end
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 206
Возвращает true, если заданный ключ присутствует в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 922
def inspect
"#<#{self.class} #{@parameters} permitted: #{@permitted}>"
end # File actionpack/lib/action_controller/metal/strong_parameters.rb, line 214
Возвращает новый массив ключей параметров.
# 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, объединенными в текущем хэше.
# 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 объединенными в текущем хэше.
# 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"}}}
# 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">
# 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
# 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.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 835 def reject!(&block) @parameters.reject!(&block) self end
Удаляет элементы, для которых блок возвращает true, и возвращает self.
# 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
например.
# 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.
# 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.
# 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.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 822 def select!(&block) @parameters.select!(&block) self end
Эквивалентно Hash#keep_if, но возвращает nil если изменений не было.
# 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>
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 727 def slice!(*keys) @parameters.slice!(*keys) self end
Возвращает текущий ActionController::Parameters экземпляр, содержащий только указанные keys.
# 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"}
# 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"}
# 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" , составляющие строку запроса, сортируются лексикографически по возрастанию.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 229 delegate :keys, :empty?, :exclude?, :include?, :as_json, :to_s, :each_key, to: :@parameters
Возвращает содержимое параметров в виде строки.
# 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"}
# 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 один раз для каждого ключа. Значения остаются неизменными.
# 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 экземпляр.
# 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>
# 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 экземпляр.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 419 def values to_enum(:each_value).to_a end
Возвращает новый массив значений параметров.
# 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.
Защищённые методы экземпляра
# 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 # 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.