2014-07-04 15 views
0

我發現很難直觀地看到類在軌中做什麼,而且我不完全理解視圖如何呈現。在軌中可視化控制器程序流

這是我正在看的代碼示例(它是創建一個簡單的用戶登錄)。

class UsersController < ApplicationController 
    def new 
     @user = User.new 
    end 

    def create 
     @user = User.new(user_params) 
     if @user.save 
      redirect_to(root_url, {notice: "Congratulations on signing up"}) 
     else 
      render "new" 
     end 
    end 

    def user_params 
     params.require(:user).permit(:email, :password) 
    end 

end 

請你指出的方式,我概念化這個任何不準確之處:

打字根網址到地址欄:

  1. 發送GET請求發送到網絡服務器到根目錄,服務器查找根目錄,看到root '/users#new'

  2. 服務器創建一個UsersController類的實例,並在該實例上調用「new」方法。

  3. 此方法創建User類的一個實例並將其存儲爲UsersController實例的實例變量。 不知何故 ??這會導致顯示users/new.html.erb頁面,這是一種形式。

  4. 您填寫表單並提交您回覆到服務器(使用信息)。

  5. 這會自動獲取用戶#create動作,並使用存儲在params散列中的變量運行該位代碼。

  6. UsersController的實例與它的模型實例一起被丟棄,但是params哈希會一直保留到它被覆蓋?

這是正確的嗎?

如何呈現視圖?

和另一個稍微偏離主題的問題。是發佈和獲得變量存儲在params哈希?

回答

1

那麼,你不應該把所有東西都當作實例化成對象的類。

讓我們考慮一個沒有Web服務器,只有應用服務器(Webrick或其他)的場景。

在您的方案,一般情況下:

瀏覽器欄上寫一個URL,將啓動「GET」請求給服務器。

您的服務器將提供捕獲的請求及其所有數據給控制器中的操作,具體取決於與稱爲路由的一組可能替代方案的匹配。路線,你可以像正則表達式一樣想象並附帶幾個選項。

然後,您的數據(本例中爲GET)被傳遞給適當的控制器操作。在那裏,這取決於邏輯,一些對象(這裏吧)可從類(如@userUser

在操作,實例化還有要麼是一個指令,告訴軌什麼渲染或默認指令會其次(默認指令:渲染一個與動作名稱相同的視圖,位於名稱與控制器名稱相匹配的文件夾中 - 所有這些都是可配置的)。

渲染視圖時,ruby會將模板轉換爲HTML或其他格式(取決於控制器的操作要求)。呈現的輸出通過接收請求的相同應用程序服務器發送到瀏覽器,因此創建'response'。

+0

謝謝。還有一個問題。很多時候你訪問params散列 - 即params [:id]。這些散列可以通過獲取和發佈http請求來創建,Ruby是否不區分它們? –

+0

從一般的面向對象ruby的角度來看,想象對象的一切正是你想要做的事情。如果沒有OO可視化,這個特定的問題可能會更容易概念化,但是不要將所有事情都想象成一個開始(實例化)。 – toolz

+0

@ZachSmith我相信每個HTTP方法都可以通過協議和[w3規範](http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) – toolz

0

您可以查看您的服務器日誌,以確切地看到在rails接觸之前傳遞了哪些參數,並且沒有參數哈希不包含所使用的HTTP方法,因爲它已經在http頭中,不需要將它們放入params哈希也是如此。

至於爲什麼render new顯示在填寫狀態的形式。這是因爲您在create中設置了變量並呈現了新模板。你只是渲染新的模板,新的模板不關心你從哪裏來的行爲只是想看看你有什麼變量,並用匹配的變量來填充模板。你在create中設置了@variable,並且你在new.html.erb中調用了@variable,所以它顯示了它。

是否合理?還是應該對此進行重新說明?