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

eme*_*ery 2 ruby controller ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

P S*_*ved 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) %>
Run Code Online (Sandbox Code Playgroud)

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