2011-03-09 67 views
2

的支架產生像這樣的新的動作:Rails中新控制器操作的目的是什麼?

def new 
    @product = Product.new 

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

def create 
    @product = Product.new(params[:product]) 

    respond_to do |format| 
     if @product.save 
     format.html { redirect_to(@product, :notice => 'Product was successfully created.') } 
     format.xml { render :xml => @product, :status => :created, :location => @product } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @product.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

和視圖呈現的部分,命名form。由於new窗體呈現與創建新產品的動作集相同,因此@product的目的是什麼?我看到create動作也會實例化一個新對象。它是否僅用於使您可以將表單綁定到對象,以便所有內容都從行爲到正確行爲?

回答

4

您可以將@product視爲一個未保存的對象,該對象只是填充視圖中呈現的表單字段。這使得new.html.erb與edit.html.erb幾乎相同,並允許它們共享一個部分的_form.html.erb。

在新操作中使用此部分時,這些字段由新鮮的空的未保存的@product對象填充。這是出現在新操作中的Product.new。在編輯動作中使用partial時,您會看到一個@product對象,它可能具有所有屬性的值。現在,假設您在新操作中沒有使用@product。 new.html.erb中使用的表單需要與編輯中使用的表單不​​同。祝你好運,如果你添加一個新的領域的模型。

這種方法的另一個優點是您可以在視圖中呈現新的@product之前預先填充它們的屬性。假設您想要使用名稱「新產品」作爲每個產品的默認名稱。你可以這樣做在新的行動:

def new 
    @product = Product.new(:name => 'new product') 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @product } 
    end 
    end 
1

如果您有form_for,則新動作用於正確初始化form_for @product中的@product,該產品需要ActiveRecord模型。如果我沒有記錯,產品的範圍(對於任何控制器操作)以請求結束,所以創建操作不知道新操作,需要另一個產品進行初始化。

form_for方法使用@product變量將表單正確地分配給資源控制器以查找正確的URL,id(在更新的情況下)等等。如果你關心的是內存使用情況,你不必初始化@product,但是你必須手動創建你自己的表單而不使用nice資源管理器,基於form_for

+0

是的,但我不明白這有什麼好處。當'create'動作被調用時,它重新定義'@ product'。 – Geo 2011-03-09 17:04:22

+0

我剛剛編輯了答案,所以我認爲你可能沒有看到它。 @產品的範圍在動作(或請求)內。其狀態不會保留在下一個請求中,即創建操作。 – 2011-03-09 17:05:52

+0

是的,當行動結束時'@ product'消失是有道理的,但爲什麼要使用它呢?爲什麼不使用與模型無關的表單?對我來說,這似乎只是對內存的浪費。我相信這一定有一個潛在的目的,但我還沒有看到它。 – Geo 2011-03-09 17:10:39

3

一個主要目的是讓您可以使用相同的表單進行新建和編輯。

控制器傳遞@product對象(新的或現有的),Rails會查看它是新記錄還是現有記錄。它會根據這些決策作出某些決定,例如將記錄值拉入輸入字段(現有)以及在提交時發送表單的控制器操作。

相關問題