2011-10-14 78 views
0

我在本書的第8章中嘗試使用「新建」和「創建」動作來爲示例應用程序實現註冊功能。這是我關於這2種方法/措施存在一些疑問,Ruby On Rails 3教程第8章:用戶控制器實現

「新」動作/方法被定義爲下文用戶控制器

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 

這裏是我的問題,

爲什麼我們是否在「新」方法/動作和「創建」方法/動作「內部兩次調用」User.new「?

感謝您的答覆,

,如果我實現創建類似下面的方法是什麼,我已經刪除了第二個電話,以新的,這是錯誤的。如果是的話有什麼不對?

def create 
if @user.save 
    # Handle a successful save. 
else 
    @title = "Sign up" 
    render 'new' 
end 

末」

感謝

回答

0

首次User.new被調用時,你是在內存中創建了一個模型,用於生成的字段來填充新用戶視圖。該HTML頁面然後被返回到客戶端,服務器忘記了所有關於它的信息,當客戶端填寫完表單並提交回服務器時,create方法在控制器上被調用,控制器做的第一件事是創建一個新的用戶模型,並使用參數填充它。在此之前,沒有任何東西被持久化,這就是爲什麼新方法被調用兩次的原因。

+0

感謝您的回覆, 請再次提問我已編輯它。 – user995487

1

如果您在erb視圖上使用form_for實現。
這使用@user對象將字段與對象屬性相關聯。 此字段將作爲鍵值對傳遞。

<%= form_for @user do |u| %> 
    <%= f.text_field :name %><br /> 
    <%= f.text_field :age %><br /> 
    <%= f.submit %> 
<% end %> 

爲此,您可以在新方法中創建一個空白用戶對象。

在創建方法中,您使用提交的參數創建對象。 這可以幫助您直接從參數創建User對象,並驗證並保存對象。

@user = User.new(params[:user]) 

提交表單後,請求參數將作爲用戶對象屬性傳遞給鍵。

+0

感謝您的回覆, 請再次提問我編輯過它。 – user995487

+0

這將不起作用,因爲@user爲零且未初始化。 create方法代表創建帶有參數的新用戶對象。你刪除的命令就是這樣。它使用請求參數中的值創建一個新的用戶模型對象,然後將這些值保存到數據庫中。 – Jayendra

0

新操作中的第一個新操作需要獲得一個空對象,稍後在視圖中的用戶窗體中使用,以便Rails窗體幫助程序可以確定窗體對象並獲取Rails需要的信息自動設置窗體的所有默認值(如默認的URL到你的UserController)。有了這些信息,表單和頁面被渲染,Rails忘記了它。(如果模型具有某些屬性的默認值,那麼這些屬性也將被設置,並且會出現在表單中)

現在,您已在窗體中填入值並提交。這個提交由create動作處理,這裏的第二個new創建一個對象,並用從表單提交的值填充它,現在在params散列中可用。該對象將具有值,如果通過驗證(結果爲true),@ user.save調用將把它們保存到數據庫中。如果存在錯誤,例如必填字段中缺少數據,則保存將失敗,並且「新」視圖中的表單將再次呈現。這次創建的對象中的數據將被填充到輸入字段中。

+0

感謝您的回覆, 如果我執行下面的創建方法,我已經刪除了第二次調用new,這是錯誤的。如果是的話有什麼不對? [code] [code] def create 'code'if @ user.save #處理成功保存。 else @title =「註冊」 渲染'新' 結束 結束 謝謝 – user995487

相關問題