为什么rails在控制器中生成对象实例变量

时间:2010-07-18 11:54:48

标签: ruby-on-rails ruby controller generator

为什么rails在生成的代码中使用@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 个答案:

答案 0 :(得分:6)

  

是否存在一些预见的常见情况,而不仅仅是在这里使用局部变量?

当然有。 默认情况就是这样。检查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不直接调用呈现页面的组件。相反,它将执行延迟到局部变量已经超出范围的程度。然后,渲染器可以与控制器中计算的内容进行通信的唯一方法是使用实​​例变量。

答案 1 :(得分:4)

当您需要在关联的视图和帮助程序中提供这些值时,使用控制器实例变量是惯用的。否则,最好在控制器逻辑中使用本地范围的变量。

那就是说,如果你发现你的控制器使用了很多变量(表明复杂性),那么最佳实践就会建议你将这个逻辑移到模型中,保持控制器的精益。