我正在阅读this article about new, create, and forms并且在用户创建过程中有一些我不完全理解的部分。
我想创建具有基本属性的用户:name
,email
。在路线上我有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
上的create
被new
@user
传递了? create
方法什么时候被激活?为什么我需要在 @user = User.new
和new
中声明create
? create
@user
何时被保存(换句话说,什么操作会保存此新用户实例)?
我为许多问题道歉。我不知道有很多幕后花絮。如果我不得不总结一下,我想要理解的是:
form_for
如何与new
和create
合作创建用户以及form_for
对每个new
{{1}的作用}和@user
&#39; s create
?
答案 0 :(得分:1)
你是对的。当您POST
到用户路线时,它会重新呈现new
方法,除非您重定向或渲染其他方法。因此,在create方法中声明实例变量@user
允许将其传递回new
模板。如果你没有指定这个实例变量,Rails会抱怨表单参数不能为空{1}}因为@user
没有设置(因为呈现模板的方法是{{1} } create
}。
答案 1 :(得分:0)
Rails将控制器实例变量复制到呈现的任何视图:呈现new
视图时,@user
变量与控制器中的@user
具有相同的值。
提交表单时(用户点击提交时)会调用create
方法。它使用提交的参数创建User
的新实例。每个http请求都由相应控制器的新实例处理,因此@user
与新操作中的实例无关。在调用@user.save