我知道在StackOverflow上已经多次询问过这个问题,但我有一个更具体的问题:
我知道new
用于创建表单,并且它不会在db上保存任何内容。
相反,create
操作会保存并验证db。
让我们看看这些:
def new
@country = Country.new
end
def create
@country = Country.new(params[:country])
respond_to do |format|
if @country.save
format.html { redirect_to countries_index_path, notice: 'Provincia Creata.' }
format.json { render :json => countries_index_path, :status => :created, :location => @country }
else
format.html { render :action => "new" }
format.json { render :json => @country.errors, :status => :unprocessable_entity }
end
end
end
我想知道,为什么框架不允许使用单个变量,从new
传递到create
来处理资源的创建?
我的意思是,在new
和create
中,我们每次创建两个不同的变量Country.new
:我们使用一个来创建表单,另一个传递表单{{1}的数据}}。
或者更好的是,为什么我们不能将两个动作Country.new(params[:country])
和new
碰撞到一个动作? (对于Restfull理论,我们可以认为)。这应该是一个愚蠢的问题,但我想在脑海中清楚这个概念。
谢谢。
答案 0 :(得分:2)
这两个动作做了两件完全不同的事情 - 一个动作呈现出一些东西,而不是写出s.th.对于DB,而其他主要目的不是为了渲染s.th.但写s.th.到DB。
当然,您只需一个动作即可编写整个应用程序。但是你最终会成为if
的巨大级联。因此,您使用路由来清除那些混乱,并分离不属于一起的内容。
一个操作是幂等而另一个不是 - 它由一个GET
镜像,另一个是POST
请求。
答案 1 :(得分:2)
好吧,原因很多。一个是那些变量不相同。这会创建一个空白国家/地区来呈现空表单:为什么框架不允许使用单个变量,从new传递给create来处理资源的创建
@country = Country.new
虽然这是两步过程(new+save
)的第一部分。它会根据提交的数据创建国家/地区对象。
@country = Country.new(params[:country])
或者更好的是,为什么我们不能碰撞新的两个动作并创建一个动作?
可以实施此类行动。告诉我,你如何区分“我想渲染一个空白表单,不保存任何东西”和“我想保存一个空对象,取所有默认值”?更不用说,你现在必须在视图中分支,分离两个不同的逻辑状态(“新形式”和“刚刚创建的对象的页面”)
答案 2 :(得分:1)
新的和创建在实现上有很大的不同 动作new用于呈现空表单。因此新的使用HTTP GET,因为GET请求不应该修改任何数据。 new仅创建本地对象,但不会尝试验证或将其保存到数据库。
但是在创建的情况下,因为我们的目标是创建新数据,所以我们使用HTTP POST来创建控制器。 create实例化新对象,验证它,然后将其保存到数据库。