Spec-Zone.ru › Ruby on Rails 4.1

class ActionController::Parameters

Parent:
ActiveSupport::HashWithIndifferentAccess

Действия контроллера Параметры

Позволяет выбрать, какие атрибуты должны быть включены в список разрешенных для массового обновления, и тем самым предотвратить случайное раскрытие того, что не должно быть раскрыто. Предоставляет два метода для этой цели: 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 выше.

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

new(attributes = nil) Показать исходный код

Возвращает новый экземпляр 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">
Вызывает метод предка ActiveSupport::HashWithIndifferentAccess.new
# 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) Показать исходный код

Возвращает параметр для заданного key. Если не найдено, возвращает nil.

params = ActionController::Parameters.new(person: { name: 'Francesco' })
params[:person] # => {"name"=>"Francesco"}
params[:none]   # => nil
Вызывает метод суперкласса ActiveSupport::HashWithIndifferentAccess.[]
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 286
def [](key)
  convert_hashes_to_parameters(key, super)
end
converted_arrays() Показать исходный код

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

# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 132
def converted_arrays
  @converted_arrays ||= Set.new
end
dup() Показать исходный код

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

params = ActionController::Parameters.new(a: 1)
params.permit!
params.permitted?        # => true
copy_params = params.dup # => {"a"=>1}
copy_params.permitted?   # => true
Вызывает метод суперкласса ActiveSupport::HashWithIndifferentAccess#dup
# File actionpack/lib/action_controller/metal/strong_parameters.rb, line 328
def dup
  super.tap do |duplicate|
    duplicate.permitted = @permitted
  end
end
fetch(key, *args) Показать исходный код

Возвращает параметр для заданного 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"
Вызывает метод суперкласса ActiveSupport::HashWithIndifferentAccess#fetch
# 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
permit(*filters) Показать исходный код

Возвращает новый экземпляр 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
permit!() Показать исходный код

Устанавливает атрибут 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
permitted?() Показать исходный код

Возвращает 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
require(key) Показать исходный код

Обеспечивает наличие параметра. Если параметр присутствует, возвращает параметр по заданному 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
Также алиас: required
required(key)

Псевдоним метода require.

Псевдоним для: require
slice(*keys) Показать исходный код

Возвращает новый 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)     # => {}
Вызывает метод суперкласса Hash#slice
# 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

Защищённые методы экземпляра

permitted=(new_permitted) Показать исходный код
# 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.

Spec-Zone.ru

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