@user在new和create中会发生什么?

时间:2016-08-12 21:51:22

标签: ruby-on-rails forms

我正在阅读this article about new, create, and forms并且在用户创建过程中有一些我不完全理解的部分。

我想创建具有基本属性的用户:nameemail。在路线上我有resources :user和:

users_controller.rb

def new
    @user = User.new
end

def create
    @user = User.new(params[:user])
    if @user.save
        redirect_to @user, alert: "User created successfully."
    else
        redirect_to new_user_path, alert: "Error creating user."
    end
end


views/users/new.html.erb

<%= form_for(@user) do |f| %>
    <%= f.label :name %>
    <%= f.text_field :name %>

    <%= f.label :email %>
    <%= f.text_field :email %>
    ...
创建new实例变量@user上的

@user = User.new。现在,我了解new @user@user中使用的<%= form_for(@user) do |f| %>相同(对吧?)。在@user方法进入 create时,我无法理解

没有create.html.erb因为create实际上是一个POST请求。这是否意味着@user上的createnew @user传递了? create方法什么时候被激活?为什么我需要在 @user = User.newnew 中声明createcreate @user何时被保存(换句话说,什么操作会保存此新用户实例)?

我为许多问题道歉。我不知道有很多幕后花絮。如果我不得不总结一下,我想要理解的是:

form_for如何与newcreate合作创建用户以及form_for对每个new {{1}的作用}和@user&#39; s create

2 个答案:

答案 0 :(得分:1)

你是对的。当您POST到用户路线时,它会重新呈现new方法,除非您重定向或渲染其他方法。因此,在create方法中声明实例变量@user允许将其传递回new模板。如果你没有指定这个实例变量,Rails会抱怨表单参数不能为空{1}}因为@user没有设置(因为呈现模板的方法是{{1} } create}。

答案 1 :(得分:0)

Rails将控制器实例变量复制到呈现的任何视图:呈现new视图时,@user变量与控制器中的@user具有相同的值。

提交表单时(用户点击提交时)会调用create方法。它使用提交的参数创建User的新实例。每个http请求都由相应控制器的新实例处理,因此@user与新操作中的实例无关。在调用@user.save

之前,数据库方面没有任何反应