2017-08-18 40 views
0

我有一個用戶模型一個簡單的應用程序,這是它的表:定義強參數時,'require'會做什麼?

create_table "users", force: :cascade do |t| 
    t.string "email" 
    t.string "name" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    . 
    . 
    . 
end 

users_controller,我們通常定義的私有方法user_params通過允許使用的參數,例如:

params.require(:user).permit(:email, :password, :password_confirmation, :name) 

我問題是關於require。在rubyonrails' api doc中,它表示:

「傳遞單個鍵時,如果它存在且其關聯值存在或單個值爲false ......給定一個鍵數組時,該方法會嘗試要求每個鍵如果成功,則返回具有相應返回值的數組......否則,該方法會重新找到發現的第一個異常...「

但在前面的示例中,app/views/users/new.html.erb頁面,如果我將:name列留空,我仍然可以成功提交。我試圖改變這樣的線:

params[:user].permit(:email, :password, :password_confirmation, :name) 

它仍然有效。雖然通過參數鍵:user時有點不同。


Rails可以通過在model.rb中使用驗證來檢查列的存在。 require在這裏做類似的事情嗎?
這兩種用法有什麼區別?任何人都可以解釋一下,或者舉個簡單的例子嗎?

謝謝!

+0

':name'是在'permit'中傳遞的密鑰之一,而不是'require'。嘗試傳遞沒有':user'的'params',你會看到異常 – Pavan

回答

1

按照documentation強參數:

允許您選擇哪些屬性應該被列入白名單的質量更新,從而防止不小心暴露的是其不應該暴露

通過定義

params.require(:user).permit(:email, :password, :password_confirmation, :name) 

you require該params有userpermit用戶包含幾個字段。如果您或第三方的請求不包含user有意義的,將引發異常:

ActionController::ParameterMissing: param is missing or the value is empty: user 

儘量不要通過user當你在控制器下面的代碼:

params[:user].permit(:email, :password, :password_confirmation, :name) 

你我會收到經典undefined method permit for nil:NilClass這是不太可讀的

希望它澄清。

+0

謝謝@Igor Drozdov。我發現這個「爲此提供了兩種方法:require和permit。前者用於根據需要標記參數。後者用來設置允許的參數,並限制哪些屬性應該被允許進行批量更新。「根據你的回答,我意識到'require'和'permit'只關心參數哈希的':key'。它實際上並不關心':key'的值是否爲零;而require中的'require'意味着在參數hash中必須有一個名爲':user'的鍵,如果沒有,它會引發一個關鍵的異常。我的理解是否正確? – Caven

+0

是的,你是對的,'permit'只是從'params [:user]'中提取入伍的密鑰' –

相關問題