我在rails中创建了一个名为product的脚手架应用程序。product_controller.rb文件包含以下内容。
class ProductsController < ApplicationController
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
flash[:notice] = 'Product was successfully created.'
format.html { redirect_to(@product) }
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现在,当给出url http://localhost:3000/products/create时
我对ROR的基本知识非常困惑。谁来帮我澄清一下。请原谅我做了这么大的一个职位。我对这段代码有很多疑问。
发布于 2011-01-01 16:58:27
哇,这可是很多问题。首先,让我推荐您拿起一份"起始Rails 3“的副本,这是Rails的一个非常棒的介绍,它将回答所有这些问题,并帮助您迅速成为一个非常可靠的rails程序员。
第二,以下是一些基本的答案:
1)你不应该浏览到products/create,你只应该浏览到products/new。无论何时浏览到URL,都会发送GET请求。“新”操作需要GET请求,但CREATE操作需要POST请求。POST请求是通过提交表单生成的。
因此,流动是这样的:
新操作用于创建适合于所涉模型(产品)的表单。当您从products/new提交表单时,它将发布到products/create,这将触发CREATE操作中的代码。
在编辑和更新中反映了NEW和CREATE之间的关系。要更改浏览到products/123/edit的对象,请提交一个触发更新操作的表单。
这一切都属于所谓的"RESTful“设计,它实际上是Rails工作方式的核心。您可能想了解更多关于REST的知识,这里是个很好的起点。
2) form_for从控制器中获取数据--但在新操作的情况下,它不是获取数据,而是一个空(新)对象。form_for是一个帮助器,它接收一个对象,并从该对象中确定一些需要发生的HTML,以便生成的表单能够正确地与控制器交互。
在products/edit加载页面时也会发生同样的情况,但区别是,如果您传递给form_for一个现有的(不是新的)对象,它将使用该对象的现有值填充表单的字段。
3)控制的传输是通过HTTP进行的,设置在HTML标记中。这是rails“魔力”的一部分,它为您处理浏览器和控制器之间的连接,因此您不必担心它。
4)我通常不使用redirect_to(@product),但我希望它会带您到您刚刚创建的产品的页面,即:products/123,其中123是产品的ID。
我希望这会有所帮助,但请考虑阅读入门Rails书籍:它非常好,您可以在大约一周内完成它,您可以在坚实的基础上开始工作,而不是在您完全不熟悉的代码中徘徊,从而节省大量时间。
发布于 2011-01-01 16:54:21
发布于 2011-01-01 16:55:16
作为一个用户,您永远不会进入/products/create路径。这是提交按钮的目的地。转到products/new时,new.html.erb模板中使用的变量的默认值。在本例中,正在创建@product。
当您单击submit按钮时,它会转到/products/create,将生成的表单内容作为params传递给它。Rails采用params,并将值分配给一个新产品(使用所谓的大规模赋值)。
Rails在很大程度上是“约定多于配置”。它假设当您从/products/new视图中单击要创建对象的submit按钮时,它知道要创建。这都是由REST定义的,你应该读一读。
最后,redirect_to是一个超级智能函数,它知道一个对象是否被传递给它,您想要转到该产品的show视图。
https://stackoverflow.com/questions/4574752
复制相似问题