2012-03-20 84 views
43

我是新來的rails,我不明白使用新的+保存方法和創建方法之間的差異。新的+保存和創建rails之間的差異

def create 
    @item = Item.new(params[:item]) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to @item, notice: 'Item was successfully created.' } 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
end 

和:

def create 

    respond_to do |format| 
     if Item.create(params[:item]) 
     format.html { redirect_to @item, notice: 'Item was successfully created.' } 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

回答

38

內部create調用new然後save反正:

def create(attributes = nil, options = {}, &block) 
    if attributes.is_a?(Array) 
     attributes.collect { |attr| create(attr, options, &block) } 
    else 
     object = new(attributes, options, &block) 
     object.save 
     object 
    end 
    end 
3
當你使用,軌道實際上是創造了記錄,但沒有保存,所以在這個過程中,你也可以指定不便

@item = Item.new(params[:item]) 

但當您使用:

if Item.create(params[:item]) 
..... 

它無線會立即創建並保存

你可以用rails c

+0

好的,但在我的情況下,使用新的+保存或只有直接創建有區別? – 2012-03-20 17:04:48

+0

不,沒有區別,他們都在做同樣的工作 – 2012-03-20 17:07:41

12

new檢查它創建的對象,但不保存它。

create創建對象保存它,即.new.save

create!創建該對象,並試圖將其保存,但如果驗證失敗,引發了異常,例如.new.save!

混淆項目之一是以上是您對某個對象所採取的操作,但是對控制器方法也給出了相似的名稱,特別是在RESTful環境中。例如,你有一個創建動作....它創建一個新的對象,然後保存它,另一個創建動作,只是做一個對象創建。

如果您想知道「如果我不打算保存它,爲什麼要創建一個對象?」考慮這一點 - 系統'嘗試'保存對象 - 但驗證會阻止它,並要求用戶填寫表單上的更多信息,也許是必填字段。我們希望這個對象在創建時仍然被創建(.new),並且它將保存迄今爲止分配的值。然而它實際上並沒有得到saved直到它通過了驗證。

97

雖然它是正確的,create電話new然後save有他們的返回值的兩個備選方案之間有很大的區別。

Save返回truefalse,具體取決於對象是否成功保存到數據庫中。這可以用於上述問題的第一個例子中的流量控制。

Create將返回模型,無論對象是否已保存。這對上述代碼有影響,因爲即使對象未通過驗證並且未保存,if語句的頂部分支也將始終執行。

如果您使用帶分支邏輯的create,則存在無聲失敗的風險,如果使用new + save,則不會發生這種情況。

create替代方法可用於控制器,其中respond_with用於API(JSON/XML)響應。在這種情況下,對象上存在的錯誤將導致錯誤在狀態爲unprocessable_entity的響應中返回,這正是您想要從API獲取的。

我總是會用html的new + save選項,尤其是如果您依賴流量控制的返回值。

+0

「如果您使用帶有分支邏輯的create,則存在無聲失敗的風險,如果您使用new + save,則不會發生這種情況。」感謝你! – jacoulter 2015-01-27 19:16:15

+0

對於對象驗證和創建速記使用: '.create(...)。valid?' 它將返回true並創建對象或返回false並且什麼也不做。 – neonmate 2015-04-22 12:45:21

+0

我說得對模態中的'new'和'save'更好嗎? @nmott是你所說的HTML嗎? – 2016-07-27 14:00:13

相關問題