Ruby / Rails: разница между "@item" и "item" в представлении - PullRequest
3 голосов
/ 13 августа 2010

У меня есть представление, которое может быть отрендерено с контроллера или частично из другого представления.

Во всем коде, который я прочитал, контроллеры назначают переменную экземпляра "@item" и затем вызывают представление. С другой стороны, при рендеринге как частичного он получает параметр «item».

Итак, все мои взгляды начинаются так:

item ||= @item

Очень не сухой. Есть ли лучший способ, по которому я скучаю?

1 Ответ

5 голосов
/ 13 августа 2010

@item - переменная экземпляра - она ​​видна всему экземпляру класса.Для целей представлений Rails вы можете рассматривать их как «глобальные» переменные.Например, если у вас есть:

class Foo
  def initialize
    @bar = "Yay!"
  end

  def show_bar
    puts @bar
  end
end

Тогда вызов Foo.new.show_bar напечатает Yay!, потому что переменная @bar видна всему экземпляру.

item с другой стороны, это локальная переменная.Он виден только в той области, в которой он был определен. Rails использует переменную экземпляра для обмена данными между методом контроллера и представлением.

Как правило, партиалы получают локальные переменные, поскольку они не должны быть в 1:1 связь с методом контроллера, как стандартные представления.То есть, хорошо спроектированная частичная не предполагает наличия каких-либо экземпляров («глобальных») переменных.Предполагается, что полный просмотр будет представлен данными, установленными методом контроллера;Предполагается, что частичные данные отображаются с помощью данных, явно переданных им.

Поскольку вы используете это представление в качестве обоих, я бы посоветовал вам преобразовать его в «только частичное, мэм»кусок и полный вид обертки кусок.Таким образом, ваше полное представление может быть таким простым:

<%=render :partial => "item_partial", :locals => {:item => @item} %>

Тогда ваш item_partial всегда будет использовать item вместо @item.

Это дает вам возможность упаковать всеваш повторно используемый контент легко, а затем добавьте дополнительный «пух» для полного просмотра по желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...