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