2011-03-09 48 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会查看它是新记录还是现有记录。它会根据这些决策作出某些决定,例如将记录值拉入输入字段(现有)以及在提交时发送表单的控制器操作。

相关问题