Rails控制器在Model.new和Model.create之间创建动作差异

我正在阅读一些Rails 3和4教程并遇到一些我喜欢的一些见解:

关于Create操作,Model.new和Model.create之间有什么区别。 我以为你确实使用控制器中的create方法来保存例如。 @post = Post.create(params[:post])但看起来我错了。 非常感谢任何见解。

使用Post.new创建操作

 def new @post = Post.new end def create @post = Post.new(post_params) @post.save redirect_to post_path(@post) end def post_params params.require(:post).permit(:title, :body) end 

使用Post.create创建操作

 def new @post = Post.new end def create @post = Post.create(post_params) @post.save redirect_to post_path(@post) end def post_params params.require(:post).permit(:title, :body) end 

我有两个问题

  • 这与Rails 4的变化有关吗?
  • 使用@post = Post.create(post_params)是不好的做法?

Model.new

下面给出params实例化并初始化Post模型:

 @post = Post.new(post_params) 

您必须运行save才能在数据库中保留您的实例:

 @post.save 

Model.create

以下实例化,初始化在数据库中保存给定params的Post模型:

 @post = Post.create(post_params) 

您不需要运行save命令,它已经内置。

关于new更多信息在这里

关于在这里 create更多信息

Model.new方法创建一个nil模型实例,而Model.create方法还试图直接将它保存到数据库中。

如果validation通过, Model.create方法创建一个对象(或多个对象)并将其保存到数据库。 无论对象是否已成功保存到数据库,都会返回结果对象。

object = Model.create不需要任何object.save方法来保存数据库中的值。


Model.new方法中,新对象可以实例化为空(不传递构造参数)

Model.new(params[:params])预先设置了属性但尚未保存在DB中(传递具有与关联表列名匹配的键名的哈希)。

object = Model.new ,我们需要通过object.save保存object.save