Обновление: изначально принятый ответ был неправильным
Сейчас я оставляю его ниже, чтобы продемонстрировать, насколько я ошибался.После достаточного количества голосов я решил посмотреть, как это на самом деле работает.Мой первоначальный ответ был написан после того, как я был совсем новичком в rails и был основан на предположении о том, как работали другие библиотеки MVC, в частности: CodeIgniter.*
AbstractController
(который включает ActionController::Base
и ваш ApplicationController
наследует) включает метод, называемый view_assigns .Этот метод извлекает все (незащищенные) переменные экземпляра из контекста вашего контроллера и возвращает их в хэше.Этот метод используется экземплярами ActionView::Base
( здесь ).
Таким образом, в основном, переменные экземпляра предоставляются вашему представлению с помощью хэша через немного магии метапрограммирования.Ваше мнение определенно не выполняется в контексте или области действия вашего контроллера.Вот почему вы должны явно объявить методы контроллера как вспомогательные методы, чтобы сделать их видимыми для ваших представлений.Эта функция активируется отдельным слоем метапрограммирования.
Оригинальный (неправильный) ответ:
Это не так уж сложно или "мета".Метод ActionController#render
выполняет код шаблона (erb, haml и т. Д.) В рамках текущего экземпляра ApplicationController
.Это означает, что весь код в вашем шаблоне выполняется внутри метода внутри вашего ApplicationController
, и поэтому имеет доступ к переменным экземпляров объекта, в котором он был выполнен.
Если вы неt call render
, затем ApplicationController попытается выяснить, какой шаблон вызывать render
с учетом имени действия.