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

时间:2013-07-31 07:02:17

标签: ruby-on-rails ruby-on-rails-3.2 ruby-on-rails-4

我正在阅读一些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)
  • 是不好的做法

2 个答案:

答案 0 :(得分:23)

<强> Model.new

以下实例化并初始化Post模型给出了参数:

@post = Post.new(post_params)

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

@post.save

<强> Model.create

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

@post = Post.create(post_params)

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

有关new here

的更多信息

有关create here

的更多信息

答案 1 :(得分:0)

Model.new方法创建一个nil模型实例,Model.create方法另外尝试将其直接保存到数据库中。

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

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


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

Model.new(params[:params])中预设有属性但尚未保存在DB中(传递一个散列,其键名与相关的表列名称相匹配)。

object = Model.new之后,我们需要按object.save

保存对象