为什么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

最佳答案

是否有一些可以预见的常见情况,在这里它是有用的,而不是简单地使用一个局部变量?
当然有。默认情况是这样的。检查script/generate/scaffold中自动生成(使用app/views/poops/show.html.erb视图)的源代码:

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

如果变量是controller方法的本地变量,那么渲染器如何访问使用find(params[:id])找到的元素?respond_to不会直接调用呈现页面的组件。相反,它会将执行延迟到局部变量已经超出范围的程度。然后,渲染器可以与控制器中计算的内容通信的唯一方法是使用实例变量。

10-07 17:04