Почему рельсы генерируют переменные экземпляра объекта в контроллерах - PullRequest
2 голосов
/ 18 июля 2010

Почему рельсы используют переменные экземпляра объекта @poop вместо локальной переменной poop в сгенерированном коде?Есть ли какая-то предвиденная распространенная ситуация, когда это полезно, а не просто использование локальной переменной здесь?Я думаю, что имеет смысл использовать локальную переменную и не прикреплять что-либо к пространству имен объекта, если вам это не нужно.

  # GET /poop/1
  # GET /poop/1.xml
  def show
    @poop = Poop.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @poop }
    end
  end

Ответы [ 2 ]

6 голосов
/ 18 июля 2010

Существует ли какая-нибудь предвиденная распространенная ситуация, когда это полезно, а не просто использование локальной переменной здесь?

Конечно, есть. Ситуация по умолчанию такая. Проверьте исходный код автоматически сгенерированного (с использованием script/generate/scaffold) представления в app/views/poops/show.html.erb:

<p>
  <b>Field:</b>
  <%=h @poop.field %>
</p>
<%= link_to 'Edit', edit_poop_path(@poop) %>

Если переменная была локальной для метода контроллера, как бы средство визуализации получило доступ к элементу, который вы нашли с помощью find(params[:id])? respond_to напрямую не вызывает компонент, который отображает страницу. Вместо этого он задерживает свое выполнение до того момента, когда локальные переменные уже будут вне области видимости. Тогда единственный способ визуализации рендерера с тем, что было вычислено в контроллере, это использование переменных экземпляра.

4 голосов
/ 18 июля 2010

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

Тем не менее, если вы обнаружите, что ваши контроллеры используют много переменных (указывающих на сложность), то лучшие практики предложат вам перенести эту логику в модели, сохраняя при этом контроллеры.

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