Ответ 1
Интересный вопрос! Я искал все источники библиотеки проекта rails для 'hash-with-ivars'
, и появилось только одно место: psych
ruby library для (де-) сериализации произвольных объектов для и YAML. В частности, это ссылки на исходный код чтения и запись этой структуры YAML.
В Глава 7 учебного пособия Rails этот вывод выводится как результат команды debug(params)
, которую вам предлагается поместить в шаблон. Команда debug
, по-видимому, вызывает библиотеку psych
для отображения читаемого представления объекта (params
в этом случае).
Теперь params
- универсальная структура данных Rails для хранения параметров, переданных из URL-адресов или форм, - это объект, который ведет себя как Hash
, но не является чистым хешем: он экземпляр класса ActionController::Parameters
, который является подклассом Hash
, см. определение :
module ActionController
# ...
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
end
end
while HashWithIndifferentAccess
является прямым подклассом Hash
.
В качестве подкласса Hash
объект params
может хранить другие данные помимо самого хэша, и это то, что psych
действительно поддерживает при попытке распечатать объект в читаемой форме. Помимо печати всех хэш-элементов (под клавишей elements
), он также пытается отобразить все переменные экземпляра объекта и распечатать его под клавишей ivars
.
Итак, в целом, эта отладочная печать просто говорит, что объект, отлаженный, является экземпляром класса ActionController::Parameters
, который является подклассом Hash
, который помимо хэш-элементов также имеет переменную экземпляра @permitted
и в настоящее время он установлен на false
. Между прочим, два элемента controller
и action
- это параметры, используемые внутри Rails для маршрутизации.
Когда вы снова заглянете в источник класса, вы действительно найдете переменную @permitted
в конструкторе:
class Parameters < ActiveSupport::HashWithIndifferentAccess
# ...
def initialize(attributes = nil)
super(attributes)
@permitted = self.class.permit_all_parameters
end
end
Наконец, из документации можно заключить, что переменная @permitted
содержит состояние разрешения params. То есть он устанавливается в true
после того, как параметры разрешены с помощью метода permit
:
permitted = params.require(:person).permit(:name, :age)
permitted.permitted? # this prints out the @permitted instance variable
# => true
Обновление: почему вывод отладки RailsTutorial отличается
Отладочный вывод в RailsTutorial отличается немного - он не печатает ivar
s. Зачем? Это связано с тем, что функция для сериализации hash-with-ivars
была добавлена в psych
gem в версии 2.0.9. Жемчуг psych
теперь является частью стандартной библиотеки Ruby, и эта конкретная версия была добавлена в версию stdlib 2.3.0 preview1.
Итак, у таинственно другого выхода есть простое объяснение: автор RailsTutorial, скорее всего, использовал ruby 2.2 или ранее при написании книги, и эта рубиновая версия еще не отображала переменные экземпляра в отладочном выпуске Hash
. На самом деле в учебнике есть подсказки, которые предлагают, что автор использовал ruby 2.1.5.