2017-08-10 15 views
0

私の質問モデルは、生徒が答えることができる質問のプロンプトと回答の選択肢を保持しています。これには、choice_0、:choice_1、:choice_2、:choice_3、:choice_4、および:choice_5という名前の列が含まれます。param値を動的に取得する

私のコントローラの一のセクションで、私は次のコードを使用した:

params[:choice_#{n}] 
:私のアプリの他の領域で

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? 

を、Iは、例えば、#{}構文を使用しました

しかし、それは何らかの理由でparamsハッシュでは機能しません。私はこれらの5つのラインを達成するためのより乾燥した方法があると確信しています。

ありがとうございました。

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

またはメソッドとして:

+1

あなたは 'paramsはを使用することができます[ "選択_#{n}が"。to_sym]' – fangxing

+0

アハ!それはシンボルに変換する必要があります! –

+3

またはそれをシンボルとして作成することができます: 'params [:" choice _#{n} "]' –

答えて

1

よりRubyの方法を試してみることはある

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

どちらの場合でも、あなたが持っています即時に作成されるため、correct_arrayを初期化する必要がないというボーナスが追加されました。

+1

さらに素晴らしい。このようなものは、私がRubyについて好きなものです。しかし私のコントローラーでは、correct_arrayを初期化する必要があると思います。なぜなら、この構文は "ケースツリー"の "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 
関連する問題