簡體   English   中英

Rails中新控制器操作的目的是什么?

[英]What is the purpose of the new controller action in 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的目的是@product 我看到create動作也實例化了一個新對象。 是否僅使用它以便您可以將表單綁定到對象,以便一切從正確的行動到行動?

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

在新操作中使用此部分時,字段將由新的,空的和未保存的@product對象填充。 這是出現在新操作中的Product.new。 當在編輯操作中使用partial時,您有一個@product對象,該對象可能具有其所有屬性的值。 現在,假設您沒有在新操作中使用@product。 new.html.erb中使用的表單需要與編輯中使用的表單不​​同。 如果您曾為模型添加新字段,請運氣好。

此方法的另一個優點是,您可以在視圖中呈現之前預先填充新@product的屬性。 假設您要使用名稱“new 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

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

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

如果您有form_for,則新操作用於正確初始化form_for @product ,該產品需要ActiveRecord模型。 如果我沒記錯的話,產品的范圍(對於任何控制器操作)都以請求結束,因此創建操作不了解新操作,需要初始化另一個產品。

form_for方法使用@product變量將表單正確分配給資源控制器,以查找正確的URL,id(在更新的情況下)等。 您可以在http://guides.rubyonrails.org/form_helpers.html的第2.3節中閱讀它

如果你擔心內存使用,你不必初始化@product ,但是你必須手動創建自己的表單而不使用基於資源的好的form_for

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM