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

Was*_*per 10 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

我有两个问题

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

Pie*_*ois 23

Model.new

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

@post = Post.new(post_params)
Run Code Online (Sandbox Code Playgroud)

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

@post.save
Run Code Online (Sandbox Code Playgroud)

Model.create

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

@post = Post.create(post_params)
Run Code Online (Sandbox Code Playgroud)

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

这里有更多信息new

这里有更多信息create

  • @Wasabi Developer的答案解决了你的问题? (2认同)

Deb*_*att 0

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

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

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


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

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

之后object = Model.new,我们需要通过以下方式保存对象object.save