какие данные контроллера доступны в html.erb? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь понять, как связаны класс контроллера и файлы .html.erb в Rails, и как представление обращается к данным в методах контроллера. Например, у меня есть следующий класс контроллера:

class SomeController < ApplicationController 

   def show
     # defining some data to access in the view
     x = 1
     @y = 2
   end

end

Если в соответствующем .html.erb файле просмотра я пытаюсь получить доступ к @y, это прекрасно работает

<p> <%= @y %> </p>

Однако, если я пытаюсь получить доступ к x, выдает ошибку

<p> <%= x %> </p>

неопределенная локальная переменная или метод 'x'

Концептуально, почему @y доступен в представлении .html.erb , а x нет.

PS: я должен добавить, что я знаю, что переменные с @ указывают переменные экземпляра в Ruby, поэтому (я думаю) @y будет переменной экземпляра экземпляра SomeController. Однако мне непонятно, как это влияет на то, к чему .html.erb файл представления имеет доступ с SomeController.

Ответы [ 5 ]

0 голосов
/ 31 августа 2018

Это область действия (область действия определяет, где в программе доступна переменная). Ruby имеет четыре типа переменной области видимости: local, global, instance и class.

В вашем случае:

  • x является локальной переменной, они локальны для кода (метода, цикла и т. Д.), В котором они объявлены.
  • @y является переменной экземпляра, они видны в любом месте экземпляра класса, в котором она была определена.

Вы можете получить доступ к x, если явно укажите его как локальный:

def show
   render locals: {
      x:  1
   }
end

Рекомендуемый способ использования переменных в представлениях - использовать instance variables. Это потому, что если вы попытаетесь использовать local variable и не передадите значение, вы получите ошибку. Но с instance variables вы получите nil.

Для получения дополнительной информации о том, как использовать local variables в представлении, вы можете проверить ссылку .

0 голосов
/ 30 августа 2018

В соответствии с описанием и ответами, упомянутыми выше, ясно, что переменные экземпляра доступны в представлениях.

Ответ на нижеследующий пункт

Концептуально, почему @y доступен в представлении .html.erb, а x - это нет.

При визуализации представлений переменные экземпляра и их значения берутся из контроллера и передаются инициализатору представления, который назначает их экземпляру представления.

Это делается с помощью следующих методов ruby:

instance_variables - gets names of instance variables  
instance_variable_get(variable_name) - gets value of an instance variable 
instance_variable_set(variable_name, variable_value) - sets value of an instance variable 

[https://github.com/rails/rails/blob/0c5552a3dd28e35cce64462765cc41c5355db0f1/actionpack/lib/abstract_controller/rendering.rb#L138-L145][1]

В приведенной выше ссылке метод с именем

"view_assigns" -> collects the controller instance variable
"view_context passes" -> them to the views
"assign(new_assigns)" -> setting them in the view
0 голосов
/ 30 августа 2018

Согласно вашему примеру, @y в контроллере не то же самое @y в представлении, однако на очень высоком уровне кажется, что они одинаковы. Rails творит много магии под капотом. Как вы уже знаете (если нет), Rails верит в соглашение о конфигурации , на данный момент Rails будет искать все instance variables в controller и скопирует их в views, даже скажем, что вы не хотите их, это будет там. Rails предоставляет все переменные экземпляра соответствующему представлению. Пока что это мое понимание, если я что-то упустил, пожалуйста, добавьте больше деталей.

0 голосов
/ 30 августа 2018

О переменных:

  • foo = 'bar' # это означает, что вы объявляете локальную переменную, недоступную для просмотра

  • @ foo = 'bar' # означает, что вы объявляете instance_variable, это будет доступно при просмотре

Также вы можете определить helper_method на контроллере, который выполняет и возвращает некоторые данные, например helpers.

0 голосов
/ 30 августа 2018

В RoR, если вы объявляете переменную в вашем контроллере как переменную экземпляра @y, она становится доступной для вашего просмотра. С другой стороны, x является локальной переменной и доступна только в пределах своей области.

...