2

我需要能夠允許包含帶可變密鑰的hash的參數。我看過其他解決方案,但似乎沒有爲我工作。Rails 4:使用可變密鑰散列的強參數

的參數如下:

{"consult_stat"=>{"iter_0"=>{"employee_id"=>"1", "consults"=>"10", "signed"=>"11"}, "iter_1"=>{"employee_id"=>"1", "consults"=>"10", "signed"=>"11"}, "iter_2"=>{"employee_id"=>"1", "consults"=>"10", "signed"=>"11"}} 

...其中的iter_x參數變化的次數。我可以硬編碼幾次迭代(見下文),但我想要一個更靈活的解決方案,根據提供的參數更改允許的參數。以下操作可達iter_5

params.require(:consult_stat).permit(:revenue, :weeks, :weeks_paid_up_front, :additional_weeks, :extensions, :paid_in_full, iter_0: [ :employee_id, :signed, :consults ], iter_1: [ :employee_id, :signed, :consults ], iter_2: [ :employee_id, :signed, :consults ], iter_3: [ :employee_id, :signed, :consults ], iter_4: [ :employee_id, :signed, :consults ], iter_5: [ :employee_id, :signed, :consults ]) 

回答

0

強PARAMS方法就是紅寶石,你不必提供文字哈希作爲參數permit,您可以提供您創建基於「iter_」存在params鍵的哈希:

iter_array = [ :employee_id, :signed, :consults ] 
p = params.require(:consult_stat) 
p.permit(
    :revenue, 
    :weeks, 
    :weeks_paid_up_front, 
    :additional_weeks, 
    :extensions, 
    :paid_in_full, 
    Hash[p.keys.grep(/^iter_\d+$/).map {|k| [k.to_sym, iter_array] }] 
) 
+1

令人驚歎。我浪費了很多時間試圖讓這個工作。我認爲是時候學習正則表達式了。一直避免它太久了 –

0

你可以做到這一點,它會工作。但是你需要小心這些價值。

params.require(:consult_stat).permit!

它將允許散列consult_stat及其任何子散列。

+1

您在那裏有一個錯字。它應該是'允許!'。 – Adrian

+0

謝謝@adrian。 –

+0

但不是不安全? –