класс 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- Контролирует поведение при возникновении параметров, которые не явноpermitted are found. The default value is <tt>:log</tt> in test and development environments, +false+ otherwise. The values can be:
-
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"
Константы
- EMPTY_ARRAY
- EMPTY_HASH
- PERMITTED_SCALAR_TYPES
-
Это список разрешенных скалярных типов, который включает поддерживаемые типы в запросах XML и JSON.
Этот список используется в частности для фильтрации обычных запросов,
Stringидет первым элементом для быстрого сокращения общего случая.Если вы измените этот список, пожалуйста, обновите
APIдляpermitвыше.
Атрибуты
Публичные методы класса
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 267
def initialize(parameters = {}, logging_context = {})
@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 275
def ==(other)
if other.respond_to?(:permitted?)
permitted? == other.permitted? && parameters == other.parameters
else
@parameters == other
end
end Возвращает true, если другой объект Parameters содержит то же самое содержимое и разрешённый флаг.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 638 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 644 def []=(key, value) @parameters[key] = value end
Присваивает значение данному key. Заданный ключ всё ещё может быть отфильтрован, когда вызывается permit.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 138
Возвращает хэш, который может быть использован как JSON-представление параметров.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 814 def compact new_instance_with_inherited_permitted_status(@parameters.compact) end
Возвращает новый экземпляр ActionController::Parameters с удалёнными значениями nil.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 819 def compact! self if @parameters.compact! end
Удаляет все значения nil на месте и возвращает self, или nil, если изменений не было.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 825
def compact_blank
reject { |_k, v| v.blank? }
end Возвращает новый экземпляр ActionController::Parameters без пустых значений. Использует Object#blank? для определения, является ли значение пустым.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 831
def compact_blank!
reject! { |_k, v| v.blank? }
end Удаляет все пустые значения на месте и возвращает self. Использует Object#blank? для определения, является ли значение пустым.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 402 def converted_arrays @converted_arrays ||= Set.new end
Атрибут, отслеживающий преобразованные массивы, если таковые имеются, чтобы избежать двойного цикла в распространённом случае permit + массового присваивания. Определён в методе для создания экземпляра только при необходимости.
Testing членство всё ещё использует цикл, но он будет быстрее, чем наш собственный цикл, который преобразует значения. Кроме того, мы не будем создавать новый объект массива для каждого извлечения.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 912
def deep_dup
self.class.new(@parameters.deep_dup, @logging_context).tap do |duplicate|
duplicate.permitted = @permitted
end
end Возвращает дубликат объекта, включая все параметры.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 765
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 774 def deep_transform_keys!(&block) @parameters.deep_transform_keys!(&block) self end
Возвращает экземпляр ActionController::Parameters, изменяя его ключи. Это включает ключи из корневого хэша и из всех вложенных хэшей и массивов. Значения не изменяются.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 783 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 682 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 146
Вызывает блок один раз для каждого ключа в параметрах, передавая ключ. Если блок не задан, вместо этого возвращается перечислитель.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 374
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 386
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 155
Возвращает true, если параметры не имеют пар ключ/значение.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 711 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 720 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 661
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 163
Возвращает true, если заданный ключ присутствует в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 171
Возвращает true, если заданное значение присутствует для какого-то ключа в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 284 def hash [@parameters.hash, @permitted].hash end
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 179
Возвращает true, если заданный ключ присутствует в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 880
def inspect
"#<#{self.class} #{@parameters} permitted: #{@permitted}>"
end # File actionpack/lib/action_controller/metal/strong_parameters.rb, line 187
Возвращает true, если заданный ключ присутствует в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 203
Возвращает новый массив ключей параметров.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 195
Возвращает true, если заданный ключ присутствует в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 843
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 851 def merge!(other_hash) @parameters.merge!(other_hash.to_h) self end
Возвращает текущий экземпляр ActionController::Parameters с other_hash, слитым в текущий хэш.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 615
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 428
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 412 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 802 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 807 def reject!(&block) @parameters.reject!(&block) self end
Удаляет элементы, для которых блок возвращает true, и возвращает self.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 489
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 858
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 867
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 789 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 794 def select!(&block) @parameters.select!(&block) self end
Эквивалент Hash#keep_if, но возвращает nil, если не было внесено изменений.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 694 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 700 def slice!(*keys) @parameters.slice!(*keys) self end
Возвращает текущий экземпляр ActionController::Parameters, который содержит только заданные keys.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 300
def to_h
if permitted?
convert_parameters_to_hashes(@parameters, :to_h)
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 320 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 352 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"
Строковые пары «ключ=значение», которые составляют строку запроса, сортируются лексикографически в порядке возрастания.
Этот метод также является псевдонимом для to_param.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 211
Возвращает содержимое параметров в виде строки.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 367 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 747
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 756 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 730
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 739
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 219
Возвращает true, если заданное значение присутствует для некоторого ключа в параметрах.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 233 delegate :keys, :key?, :has_key?, :member?, :values, :has_value?, :value?, :empty?, :include?, :as_json, :to_s, :each_key, to: :@parameters
Возвращает новый массив значений параметров.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 837 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 927
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 923
def nested_attributes?
@parameters.any? { |k, v| Parameters.nested_attribute?(k, v) }
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.