A working form
在 routes.rb 設定 resources :users 之後,就可以使用 RESTful 的架構。
發送到 /users 的 POST 請求會交給 create action 處理,在 create action 中可以調用 User.new 方法,使用提交的資料建立一個新使用者,嘗試存進資料庫,如果失敗會重載註冊頁面,讓使用者重新填寫註冊資訊。
撰寫 create action 的程式碼:
app/controllers/users_controller.rb
def create
@user = User.new(params[:user]) # Not the final implementation!
if @user.save
# Handle a successful save.
else
render 'new'
end
end
利用 if..else 來控制成功或失敗的動作,當儲存失敗的時候,使用 render 方法,重載註冊頁面。
@user = User.new(params[:user]) 這行不是最終的寫法,後面會講到其他方式。
現在來測試填入無效的註冊資料,會發生什麼事:

出現錯誤頁面的同時,底下有個 web console 可以進入到 Rails console 來幫助除錯。例如查詢 User model,不過這個例子中我們想查詢的是 params,在 web console 無法看到。
這是完整的除錯資訊:

進一步的看除錯訊息,裡面有個 user 部分:
"user" => { "name" => "Foo Bar",
"email" => "foo@invalid",
"password" => "[FILTERED]",
"password_confirmation" => "[FILTERED]"
}
這個 hash 是 params 的一部份,會傳給 Users controller。前面提過, params hash 中會包括每次請求的資訊,例如向 /users/1 發送請求時,params[:id] 的值就是使用者的 ID,也就是 1。
提交表單發送 POST 請求時,params 是一個巢狀 hash。上面的除錯訊息指出,提交表單後,Rails 會建立一個叫 user 的 hash,hash 中的 key 是 input 標籤的 name 屬性值,而 key 對應的 value 就是使用者填寫的內容,例如:
<input id="user_email" name="user[email]" type="email" />
name 屬性值是 user[email],表示 user hash 中的 email屬性。
雖然在除錯訊息中的 hash 的 keys 是用字串形式表示,但可以在 Users controller 中使用 symbol 來讀取這些 keys,所以 params[:user] 這個巢狀 hash 實際上就是 User.new 方法建立使用者時需要的參數。
也就是說:
@user = User.new(params[:user])
其實等於:
@user = User.new(name: "Foo Bar", email: "foo@invalid",
password: "foo", password_confirmation: "bar")
Rails 之前的版本都是使用:
@user = User.new(params[:user])
不過這種寫法不安全,可能會導致被惡意的使用者竄改資料庫,在 Rails 4.0 之後的版本,這樣寫會拋出錯誤。