2016-07-22 20 views
0

我的團隊中的一個人建議使用ActionController :: Parameters#require方法來驗證用戶在窗體中提交'required'輸入。使用強參數要求作爲'所需表單屬性'驗證

對我來說,它不適合,因爲你必須從ActiveRecord模型(presence:true)中分別處理錯誤。

例如,假設我們有一個用戶:name,:age和:zip_code。並且:姓名和年齡是必需的。

他想要的東西,如:

def user_params 
    params.require(:user).require(:name) 
    params.require(:user).require(:age) 
    params.require(:user).permit(:zip_code) 
end 

對我來說,這似乎是強大的參數是不是爲此而設計和模型驗證一樣presence: true它的更乾淨。

你認爲什麼是好的做法?爲什麼使用一個而不是另一個?

回答

1

模型驗證與此完全不同。你有模型驗證來實現在字段上允許什麼值,什麼是必填字段等等。這更多的是關於業務邏輯。但是,強大的參數是一種安全措施。

有強大的參數來防止用戶更新數據庫中不需要的字段。這是一個安全措施,以便應用程序決定哪些字段可以在數據庫中更新。舉個例子,如果你的表中有名字,年齡,zip_code和login_attempt。 login_attempt用於計算失敗的登錄嘗試次數。如果你沒有強大的參數和保存用戶更改如下,

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

用戶可以輕鬆更新login_attempt領域也是如此。爲了防止這個軌道具有強大的參數。所以,你不再需要將不需要的字段更新到表中。當你嘗試更新不允許的字段時,你會得到這個ForbiddenAttributesError。正確的做法如下,

def allowed_params 
    params.require(:user).permit(:name, :age, :zip_code) 
end 

@user = User.new(allowed_params) 
@user.save