Где находится отладочная информация, поступающая из

В главе 7 я получаю следующий вывод с

--- !ruby/hash-with-ivars:ActionController::Parameters
elements:
  controller: static_pages
  action: home
ivars:
  :@permitted: false

может кто-нибудь объяснить, откуда берутся хеш-с-ivars, и что такое ivars:     : @pedmitted: false означает?

Ответ 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.