class ActionController::Parameters
Действия контроллера Параметры
Позволяет выбрать, какие атрибуты должны быть включены в список разрешенных для массового обновления, и тем самым предотвратить случайное раскрытие того, что не должно быть раскрыто. Предоставляет два метода для этой цели: require и permit. Первый используется для обозначения параметров как обязательных. Последний используется для установки параметра как разрешенного и ограничения атрибутов, которые должны быть разрешены для массового обновления.
params = ActionController::Parameters.new({
person: {
name: 'Francesco',
age: 22,
role: 'admin'
}
})
permitted = params.require(:person).permit(:name, :age)
permitted # => {"name"=>"Francesco", "age"=>22}
permitted.class # => ActionController::Parameters
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для записи сообщения в журнал или:raiseдля повышения исключения ActionController::UnpermittedParameters. Значение по умолчанию —:logв тестовых и отладочных средах,falseв противном случае.
Примеры:
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.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 унаследован от ActiveSupport::HashWithIndifferentAccess, это означает, что вы можете получить значения, используя либо :key или "key".
params = ActionController::Parameters.new(key: 'value') params[:key] # => "value" params["key"] # => "value"
Константы
- EMPTY_ARRAY
- NEVER_UNPERMITTED_PARAMS
-
Никогда не генерировать исключение UnpermittedParameters из-за наличия этих параметров. Они добавляются Rails и не представляют интереса.
- PERMITTED_SCALAR_TYPES
-
Это белый список разрешенных скалярных типов, который включает типы, поддерживаемые в запросах XML и JSON.
Этот список используется в частности для фильтрации обычных запросов, String стоит первым для быстрого обхода распространённого случая.
Если вы изменяете это собрание, обновите API
permitвыше.
Публичные методы класса
Возвращает новый экземпляр 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 124 def initialize(attributes = nil) super(attributes) @permitted = self.class.permit_all_parameters end
Общедоступные методы экземпляров
Возвращает параметр для заданного key. Если не найдено, возвращает nil.
params = ActionController::Parameters.new(person: { name: 'Francesco' })
params[:person] # => {"name"=>"Francesco"}
params[:none] # => nil
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 286 def [](key) convert_hashes_to_parameters(key, super) end
Атрибут, отслеживающий преобразованные массивы (если таковые имеются), чтобы избежать двойного цикла в общем случае с разрешением + массовой привязкой. Определен в методе, чтобы инициализировать его только при необходимости.
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 132 def converted_arrays @converted_arrays ||= Set.new end
Возвращает точную копию экземпляра ActionController::Parameters. permitted состояние сохраняется в дублированном объекте.
params = ActionController::Parameters.new(a: 1)
params.permit!
params.permitted? # => true
copy_params = params.dup # => {"a"=>1}
copy_params.permitted? # => true
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 328
def dup
super.tap do |duplicate|
duplicate.permitted = @permitted
end
end Возвращает параметр для заданного key. Если key не найдено, есть несколько вариантов: без дополнительных аргументов будет выброшено исключение ActionController::ParameterMissing; если предоставлены дополнительные аргументы, то они будут возвращены; если задан блок, то будет выполнен этот блок, и результат будет возвращён.
params = ActionController::Parameters.new(person: { name: 'Francesco' })
params.fetch(:person) # => {"name"=>"Francesco"}
params.fetch(:none) # => ActionController::ParameterMissing: param not found: none
params.fetch(:none, 'Francesco') # => "Francesco"
params.fetch(:none) { 'Francesco' } # => "Francesco"
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 301 def fetch(key, *args) convert_hashes_to_parameters(key, super, false) rescue KeyError raise ActionController::ParameterMissing.new(key) 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. В противном случае ключ :name отфильтровывается.
Вы можете указать, что параметр должен быть массивом разрешенных скаляров, сопоставив его с пустым массивом:
params = ActionController::Parameters.new(tags: ['rails', 'parameters']) params.permit(tags: [])
Вы также можете использовать 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)
# => {}
params.require(:person).permit(contact: :phone)
# => {"contact"=>{"phone"=>"555-1234"}}
params.require(:person).permit(contact: [ :email, :phone ])
# => {"contact"=>{"email"=>"none@test.com", "phone"=>"555-1234"}}
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 263
def permit(*filters)
params = self.class.new
filters.flatten.each do |filter|
case filter
when Symbol, String
permitted_scalar_filter(params, filter)
when Hash then
hash_filter(params, filter)
end
end
unpermitted_parameters!(params) if self.class.action_on_unpermitted_parameters
params.permit!
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 158
def permit!
each_pair do |key, value|
value = convert_hashes_to_parameters(key, value)
Array.wrap(value).each do |_|
_.permit! if _.respond_to? :permit!
end
end
@permitted = true
self
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 142 def permitted? @permitted end
Обеспечивает наличие параметра. Если параметр присутствует, возвращает параметр по заданному key, в противном случае генерирует ошибку ActionController::ParameterMissing.
ActionController::Parameters.new(person: { name: 'Francesco' }).require(:person)
# => {"name"=>"Francesco"}
ActionController::Parameters.new(person: nil).require(:person)
# => ActionController::ParameterMissing: param not found: person
ActionController::Parameters.new(person: {}).require(:person)
# => ActionController::ParameterMissing: param not found: person
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 182
def require(key)
value = self[key]
if value.present? || value == false
value
else
raise ParameterMissing.new(key)
end
end Возвращает новый ActionController::Parameters объект, содержащий только указанные keys. Если указанные keys не существуют, возвращает пустой хэш.
params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
params.slice(:a, :b) # => {"a"=>1, "b"=>2}
params.slice(:d) # => {}
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 314
def slice(*keys)
self.class.new(super).tap do |new_instance|
new_instance.permitted = @permitted
end
end Защищённые методы экземпляра
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 335 def permitted=(new_permitted) @permitted = new_permitted end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.