我在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
Run Code Online (Sandbox Code Playgroud)
现在http://localhost:3000/products/create给出了网址
单击新产品链接时,控制将转移到控制器类中的新定义,然后创建实例变量@product.但是这个变量通过了什么?该函数依次调用包含的new.rhtml
<% form_for(@product) do |f| %>
#all form elements declaration
<% f.submit "Create" %>
<%= end %>
Run Code Online (Sandbox Code Playgroud)这里@product在控制器文件中初始化并传递给这个new.rhtml.那么form_for(@product)在哪里获取数据?
当单击提交按钮时,控件如何转换为在控制器文件中创建功能?否为控制器文件指定了操作.
在create function中,redirect_to(@product)指定@product是从new.html文件接收的对象的位置...
我对ROR的基础知识非常困惑.有人请帮我澄清一下.请原谅我发这么大的帖子.我对这段代码有很多疑问
哇,那是很多问题.首先,我建议你拿一本" Beginning Rails 3 ",这是对Rails的精彩介绍,它将回答所有这些问题并帮助你快速成为一个非常扎实的rails程序员.
其次,这里有一些基本的答案:
1)您不应浏览products/create,只需浏览即可products/new.每当您浏览到您正在发送GET请求的URL时."new"操作需要GET请求,但CREATE操作需要POST请求.通过提交表单生成POST请求.
因此,流程是这样的:
NEW操作用于创建适合所讨论模型(产品)的表单.当您从表单提交表单时products/new,将POST到products/create,这将触发CREATE操作中的代码.
NEW和CREATE之间的关系在EDIT和UPDATE中反映出来.即,要更改您浏览的对象products/123/edit,然后从那里提交一个触发UPDATE操作的表单.
这一切都属于所谓的"RESTful"设计,这实际上是Rails工作的核心.您可能想要了解有关REST的更多信息,这是一个很好的起点.
2)form_for从控制器获取数据 - 但是在新操作的情况下,它不是获取数据,而是获取空(新)对象.form_for是一个帮助器,它接收一个对象,并从该对象确定需要发生的一些HTML,以便生成的表单与您的控制器正确交互.
加载页面时会发生同样的情况products/edit,但不同之处在于,如果传递form_for现有(非新)对象,它将使用对象中的现有值填充表单的字段.
3)通过HTML <form>标记中设置的HTTP请求进行控制转移.这是rails的"魔力"的一部分,它为您处理浏览器和控制器之间的联系,因此您不必担心它.
4)我通常不会使用redirect_to(@product),但我希望它能带你到你刚创建的产品的页面,即:products/123123是产品的ID.
我希望这会有所帮助,但是请考虑选择Beginning Rails书:它非常好,你可以在大约一周内完成它,你将通过开始坚实的基础而不是徘徊来节省大量的时间这样的代码对你来说完全不熟悉.
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |