Как переменные экземпляра Rails передаются в представления?

В моем приложении Rails у меня есть такой controller:

class MyController < ApplicationController def show @blog_post = BlogPost.find params[:id] end end 

На мой взгляд, я могу просто сделать это:

  

Мне неудобно с магией. Как это достигается?

Когда визуализируется представление, переменные экземпляра и их значения выбираются из controllerа и передаются в инициализатор представления, который устанавливает их в экземпляр представления. Это делается с использованием этих rubyовых методов:

instance_variables – получает имена переменных экземпляра ( документация ) instance_variable_get(variable_name) – получает значение переменной экземпляра ( документация ) instance_variable_set(variable_name, variable_value) – устанавливает значение переменной экземпляра ( документация )

Вот код Rails:

Сбор переменных экземпляра controllerа ( github ):

 def view_assigns hash = {} variables = instance_variables variables -= protected_instance_variables variables -= DEFAULT_PROTECTED_INSTANCE_VARIABLES variables.each { |name| hash[name[1..-1]] = instance_variable_get(name) } hash end 

Передача их в представление ( github ):

 def view_context view_context_class.new(view_renderer, view_assigns, self) end 

Установка их в виде ( github ):

 def assign(new_assigns) # :nodoc: @_assigns = new_assigns.each { |key, value| instance_variable_set("@#{key}", value) } end 

Жесткость прилипания_экспозиции является альтернативой поведению переменных экземпляра controllerа Rails. В readme есть хорошая запись об этой проблеме.

  • Rails: Как работает блок response_to?
  • Проверить наличие одного поля (XOR)
  • Переопределение Rails default_scope
  • Ruby on Rails form_ для выбора поля с classом
  • переменная экземпляра против символа в rubyе на рельсах (form_for)
  • Rails select helper - выбранное значение по умолчанию, как?
  • Поймать все исключения в controllerе рельсов
  • rails server bin / rails: 6: предупреждение: уже инициализированная постоянная ошибка APP_PATH
  • net :: ERR_INCOMPLETE_CHUNKED_ENCODING только в Chrome
  • Rails: вызов другого действия controllerа с controllerа
  • Перенаправить запросы, не связанные с WWW, на www-адреса в Rails
  • Давайте будем гением компьютера.