2010-07-18 71 views
2

爲什麼rails在生成的代碼中使用@poop對象實例變量而不僅僅是本地poop變量?有沒有一些預見到的常見情況,而不是簡單地使用局部變量?我認爲使用局部變量是有意義的,並且不要將某些東西附加到對象名稱空間,除非您需要它。爲什麼rails會在控制器中生成對象實例變量

# 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 

回答

4

當需要在相關的視圖和助手中使這些值可用時,使用控制器實例變量是一種慣用方法。否則,在控制器邏輯中使用本地作用域變量可能更可取。也就是說,如果你發現你的控制器正在使用很多變量(表示複雜度),那麼最佳實踐將建議你將該邏輯移入模型中,保持控制器精益。

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不直接調用呈現頁面的組件。相反,它會延遲執行,直到局部變量已超出範圍。然後,渲染器可以與控制器中計算的內容進行通信的唯一方法是使用實​​例變量。

相關問題