我在本书的第8章,我们正在尝试使用“new”和“create”操作实现示例应用程序的注册功能。以下是关于这两种方法/行动的问题,
“新”操作/方法在用户控制器
中定义如下class UsersController < ApplicationController
.
.
.
def new
@user = User.new
@title = "Sign up"
end
end
这里定义了@user,以便可以以html页面的形式访问它以进行注册。一旦用户点击注册按钮,就会调用用户控制器的“创建”操作/方法,下面是创建操作/方法的代码,
class UsersController < ApplicationController
.
.
.
def create
@user = User.new(params[:user])
if @user.save
# Handle a successful save.
else
@title = "Sign up"
render 'new'
end
end
end
这是我的问题,
为什么我们在“new'method / action”和“create”方法/动作“里面两次调用”User.new“?
感谢您的回复,
如果我实现类似下面的创建方法,我已经删除了对new的第二次调用,这是错误的。如果是的话有什么不对?
def create
if @user.save
# Handle a successful save.
else
@title = "Sign up"
render 'new'
end
端“
由于
答案 0 :(得分:1)
如果您在erb视图中使用form_for实现。
这使用@user对象将字段与对象属性相关联。
此字段将作为键值对传递。
<%= form_for @user do |u| %>
<%= f.text_field :name %><br />
<%= f.text_field :age %><br />
<%= f.submit %>
<% end %>
为此,您在新方法中创建一个空白用户对象。
在create方法中,您可以使用提交的参数创建对象。 这有助于您直接从参数创建User对象,并验证和保存对象。
@user = User.new(params[:user])
提交表单后,请求参数传递给密钥作为用户对象属性。
答案 1 :(得分:0)
第一次调用User.new时,您将在内存中创建一个模型,用于生成填充新用户视图的字段。然后该html页面返回到客户端,服务器忘记了它的全部内容。当客户端填写表单并将其提交回服务器时,将在控制器上调用create方法。控制器做的第一件事是创建一个新的User模型,并用参数填充它。在此之前,没有任何内容持续存在,这就是新方法被调用两次的原因
答案 2 :(得分:0)
新操作中的第一个新内容需要获取一个空对象,稍后将在视图中的用户表单中使用,以便Rails表单帮助程序可以确定表单对象并获取Rails需要的信息。自动设置表单的所有默认值(如默认URL到UserController)。使用此信息,表单和页面将被重新提供,Rails会忘记它。 (如果模型具有某些属性的默认值,那么这些属性也会设置并显示在表单中)
现在您在浏览器中有表单,填写值并提交。此提交由create action处理,此处第二个new创建一个对象,并使用从表单提交的值填充它,现在可以在params哈希中使用。此对象将具有值,如果它们通过验证,则@ user.save调用将将它们保存到数据库(结果为true)。如果存在错误,例如必填字段中缺少数据,则保存将失败,并且将再次呈现“新”视图中的表单。这次使用了创建的对象中的数据,因此所有有效数据都将填入输入字段。