2017-08-10 77 views
0

我的問題模型爲學生可以回答的問題提供提示和答案選項。它包括名爲:choice_0,:choice_1,:choice_2,:choice_3,:choice_4和:choice_5的列。動態獲取參數值

在我的控制器的一個部分,我用下面的代碼:

correct_array.push(these_params[:choice_0]) if !these_params[:choice_0].blank? 
correct_array.push(these_params[:choice_1]) if !these_params[:choice_1].blank? 
correct_array.push(these_params[:choice_2]) if !these_params[:choice_2].blank? 
correct_array.push(these_params[:choice_3]) if !these_params[:choice_3].blank? 
correct_array.push(these_params[:choice_4]) if !these_params[:choice_4].blank? 
correct_array.push(these_params[:choice_5]) if !these_params[:choice_5].blank? 

在我的應用程序的其他領域,我已經使用了#{}語法,例如:

params[:choice_#{n}] 

但是,由於某種原因,這在params散列內不起作用。我相信有一種更乾燥的方式來完成這五條線。

非常感謝您的任何見解。

+1

您可以使用'params [「choice _#{n}」。to_sym]' – fangxing

+0

Aha!它需要被轉換爲符號! –

+3

或者你可以將它創建爲符號:'params [:「choice _#{n}」]' –

回答

1

更Ruby的方式來做到這一點是:

correct_array = (0..5).map { |i| these_params["choice_#{i}".to_sym] }.select(&:present?) 

或方法:

def correct_array 
    (0..5).map { |i| these_params["choice_#{i}".to_sym] }.select(&:present?) 
end 

在這兩種情況下,你有因爲它是在飛行中創建的,所以不需要初始化correct_array

+1

更加棒。像這樣的東西是我喜歡Ruby的東西。然而,在我的控制器中,我認爲我仍然需要初始化correct_array,因爲這個語法出現在「case樹」的「when」分支中。當問題的風格是「填充」時,它以這種方式填充correct_array,但是當風格是「多項選擇」時,以不同的方式填充correct_array。在案例樹的末尾,它使用@ question.update(:correct_answers => correct_array)更新模型。儘管可能還有一些我還沒有意識到的Ruby魔法。 –

1

你可以試試這個

(0..5).each do |i| 
    param_i = these_params["choice_#{i}".to_sym] 
    correct_array.push(param_i) if param_i.present? 
end