2015-10-18 134 views
2

我到處搜索試圖找到解釋如何工作/它的目的是什麼,但我找不到任何有用的。 我正在做Michael Hartl的教程,我的問題主要是關於兩個操作:'新'和'創建'。 新的動作有以下幾點:Ruby on Rails中User.new的解釋? (從邁克爾哈特爾的教程)

def new 
    @user = User.new 
end 

,在對應於「新」行動的看法,有一個的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 '實際上是創建對象的動作。任何幫助都非常讚賞。謝謝大家一直盡力解釋。提前感謝任何回答此問題的人。

回答

1

這就是所謂的object orientated programming

enter image description here


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在將它變成一個無縫過程方面做得非常出色,但如果你還沒有掌握它的話,這可能很困難。

+0

好吧......我想我現在明白了,至少比我在提問之前做得更好。 Rich,我必須感謝你的迴應。感謝您調整我的原始問題,我仍然在學習如何正確使用本網站。感謝您讓編程社區對新人感到歡迎。 – Parker

+0

感謝您的友好的話!沒問題,一旦你意識到許多基礎知識,你會學得更快。當它開始受到傷害時,你不知道核心功能 –

2

新建和創建是不同的操作。當您獲得新路線時,將調用新路線。當您發佈到新路線時,會調用創建。因此,您必須以新的方式創建用戶,以便他們在表單中可用。您必須在創建時使用表單內容創建用戶,以便將其保存到數據庫中。

你不能假設請求新會去同軌實例作爲創建請求。在代理之後運行應用的多個實例是很常見的。

0

通常,用戶輸入數據,我們程序員類型傳統上將其存儲在關係數據庫中。

這就產生了一個關係模型(即,表和行)和一個面向對象的一個​​(粗略,類和實例)之間的「阻抗」。

奧姆斯比如ActiveRecord幫助這個乏味的抽象得多,並以這種方式模型實例 - 比如那些我們正在創建中的控制器動作 - 服務於數據樂於助人的容器。

這讓我們收集用戶輸入時容易代表視圖模式,並結合輸入持續時(基本CRUD)到屬性建模。

的單獨的控制器的動作僅代表過程這兩個步驟,如任何基於Web的應用程序最終會講HTTP。

這是真正的整體利益及成因Rails和類似的MVC框架,出生在關係數據庫和服務器端渲染的時間。 (儘管他們越來越多地應對和適應現在包含文檔/面向對象數據庫和客戶端腳本前端的環境。)