2017-01-04 126 views
0

我試圖通過強參數允許具有某些值的散列值或零值。我現在有以下幾點:允許散列或零參數很強

params.require(:parent).permit(child: [:attr1, :attr2]) 

如果我把這個動作:

{ "parent": { "child": nil }} 

的Rails不允許孩子參數。 (Unpermitted parameter: child

我該如何說服rails同時允許nil和哈希?我知道你可以通過這樣做允許零值:

params.require(:parent).permit(:child, child: [:attr1, :attr2]) 

但是,這也允許字符串值。

+0

你試圖允許一個哈希輸入,或接受嵌套資源?這些是非常不同的用例 – TheRealMrCrowley

回答

2

在這裏做的最好的事情,我想,是這樣做是爲了讓所有的值:

params.require(:parent).permit(:child) 

應該允許通過任何東西,甚至爲零,但通過寫自己的自定義查詢類型驗證。

validate :child_is_nil_or_hash 
... 
def child_is_nil_or_hash 
    unless child.is_a?(Hash) || child.nil? 
    errors.add(:child, 'must be nil or a hash') 
    end 
end 

或類似的情況。我沒有正確測試過這段代碼。

在此示例中,您將驗證職責從參數白名單移入其所屬的Rails驗證。

+0

這與params.require(:parent).permit(:child,child:[:attr1,:attr2])'完全相同,只是更加不安全,因爲它允許哈希值。 – Roy

+0

@羅伊:你找到了解決辦法嗎? – thiebo

+0

@羅伊這是正確的答案。強大的參數是關於設置什麼鍵應該允許的。絕對不是更不安全。現在對該密鑰所允許的內容的驗證在模型驗證中應該在哪裏。在他上面發佈的代碼中,除了散列輸入或nil值以外的其他東西都會拋出錯誤 – TheRealMrCrowley