【问题标题】:Explanation of User.new in Ruby on Rails? (From Michael Hartl's tutorial)Ruby on Rails 中 User.new 的解释? (来自 Michael Hartl 的教程)
【发布时间】:2015-10-18 13:58:02
【问题描述】:

我到处搜索,试图找到有关其工作原理/用途的解释,但找不到任何有用的信息。 我正在做 Michael Hartl 的教程,我的问题主要是关于两个动作:“新建”和“创建”。 新操作具有以下内容:

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 isnttance 变量?在我们的“创建”操作中只有 @user = User.new(user_params) 还不够吗? User.new 是否需要以某种方式使表单正常运行?

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

【问题讨论】:

  • 你问我现在想知道什么,谢谢!在阅读了整个问答之后,我想我对这部分的了解更多。

标签: ruby-on-rails ruby


【解决方案1】:

new 和 create 是不同的操作。当您获得新路线时,会调用 New。当您发布到新路线时,会调用 Create。因此,您必须在新用户中创建用户,以便它们在表单中可用。您必须在 create 中使用表单内容创建用户,以便将其保存到数据库中。

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

【讨论】:

    【解决方案2】:

    它叫object orientated programming


    HTTP

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

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

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

    这就是为什么在模型(类)上使用类函数调用 Rails“变量”的原因: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 的缺陷之一——您的服务器是“哑巴”并且无法在请求之间保留状态。尽管 Rails 在使其成为无缝流程方面做得很好,但如果您还没有认真对待它,这可能会很困难。

    【讨论】:

    • 好吧...我想我现在明白了,至少比我问这个问题之前更好。我必须感谢你的回应,Rich。感谢您也调整了我原来的问题,我仍在学习如何正确使用这个网站。感谢您让编程社区如此欢迎新人。
    • 感谢您的客气话!没问题,一旦你了解了许多基础知识,你就会学得更快。当它开始受到伤害时,你不知道核心功能
    【解决方案3】:

    大多数情况下,用户输入数据,而我们这些程序员类型通常将其存储在关系数据库中。

    这会在关系模型(即表和行)和面向对象的模型(大致是类和实例)之间产生“阻抗”。

    像 ActiveRecord 这样的 ORM 有助于抽象出大部分乏味的工作,并且通过这种方式模型实例(例如我们在控制器操作中创建的实例)充当有用的数据容器。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多