Ruby on Rails中User.new的解释? (来自Michael Hartl的教程)

时间:2015-10-18 13:58:02

标签: ruby-on-rails ruby

我到处寻找,试图找到一个如何工作/它的目的是什么的解释,但我找不到任何有用的东西。 我正在做Michael Hartl的教程,我的问题主要是两个动作:'new'和'create'。 新行动有以下几点:

def new
  @user = User.new
end

在与“new”操作相对应的视图中,有一个form_for帮助器,用户可以在其中键入其属性并点击提交。正如所料,form_for助手的开头如下所示: 的form_for(@user)

然而,这里是我难倒的地方......在创建动作中,有以下代码:

def create
  @user = User.new(user_params)  
  #user_params is a function we defined which simply returns the permitted params from the user.

“新”行动中@user = User.new的目的是什么? User.new甚至完成了什么?我假设实例变量@user是传递给表单所必需的,但在这种情况下,为什么我们必须在'create'中重新声明@user isntance变量?仅仅在我们的'创建'操作中只有@user = User.new(user_params)是不够的? User.new是否有必要使表单正常运行?

我主要是想弄清楚@user = User.new在我们的'new'操作及其相应的'new'视图(带有表单)中完成了什么,以及当我们有'create'时为什么有必要实际创建对象的动作。任何帮助都非常值得赞赏。谢谢大家一直尽力解释。提前感谢任何回答此问题的人。

3 个答案:

答案 0 :(得分:2)

新的和创造是不同的行动。获得新路线时会调用新的。发布到新路线时会调用创建。因此,您必须以新的方式创建用户,以便它们在表单中可用。您必须在create中创建具有表单内容的用户,以便将其保存到数据库中。

您不能假设对new的请求将转到与创建请求相同的rails实例。在代理服务器后面运行多个应用实例是很常见的。

答案 1 :(得分:1)

它被称为object orientated programming

enter image description here

<强> HTTP

在Ruby中,您定义的每个变量都是对象。然后在应用程序的每个实例中操纵这些对象。

在传统的(stateful)应用程序中,您的计算机能够在内存中存储大量对象,并且由于您的应用程序始终处于状态,你可以通过一次调用来操纵它们。

在HTTP(stateless)应用程序中,您必须在每次调用时重建对象。由于您的应用程序不会在每个请求之间保留状态(内存),因此您必须再次构建对象。

这就是为什么Rails&#34;变量&#34;在模型(类)上使用类函数调用:User.find ...

-

因此,使用以下内容时:

#app/controllers/your_controller.rb
class YourController < ApplicationController
   def new
      @user = User.new #-> invokes a new user object
   end

   def create
      @user = User.new user_params #-> invokes a new user object & populates with your params
      @user.save #-> "saves" the new record
   end

   def show
      @user = User.find params[:id] #-> stateless means you have to rebuild the object again
   end
end

...您每次调用操作时都在重建对象。

这是使用HTTP的一个陷阱 - 您的服务器是&#34; dumb&#34;并且不能在请求之间保持状态。尽管Rails在使其成为一个无缝过程方面做得很好,但如果你还没有掌握它,那就很难了。

答案 2 :(得分:0)

大多数情况下,用户输入数据,我们程序员类型传统上将其存储在关系数据库中。

这会在关系模型(即表和行)与面向对象模型(粗略地,类和实例)之间产生“阻抗”。

像ActiveRecord这样的ORM帮助抽象出这个单调乏味的东西,这样模型实例 - 比如我们在控制器动作中创建的实例 - 就可以作为数据的有用容器。

这使我们可以在收集用户输入时轻松地在视图中表示模型,并在持久化时将输入绑定到模型属性(基本CRUD)。

单独的控制器操作仅代表流程中的这两个步骤,因为任何基于Web的应用程序最终都会说HTTP。

这实际上是Rails和类似MVC框架的全部好处和起源,诞生于关系数据库和服务器端呈现的时代。 (尽管他们越来越多地应对并适应现在包含面向文档/面向对象的数据库和客户端脚本化前端的环境。)