Ruby On Rails 3教程第8章:用户控制器实现

时间:2011-10-14 13:37:51

标签: ruby-on-rails

我在本书的第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

端“

由于

3 个答案:

答案 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)。如果存在错误,例如必填字段中缺少数据,则保存将失败,并且将再次呈现“新”视图中的表单。这次使用了创建的对象中的数据,因此所有有效数据都将填入输入字段。