新建和创建(或编辑和更新)Rails之间的区别

时间:2015-08-31 08:47:29

标签: ruby-on-rails rest action

我知道在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来处理资源的创建? 我的意思是,在newcreate中,我们每次创建两个不同的变量Country.new:我们使用一个来创建表单,另一个传递表单{{1}的数据}}。 或者更好的是,为什么我们不能将两个动作Country.new(params[:country])new碰撞到一个动作? (对于Restfull理论,我们可以认为)。这应该是一个愚蠢的问题,但我想在脑海中清楚这个概念。

谢谢。

3 个答案:

答案 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实例化新对象,验证它,然后将其保存到数据库。