2011-01-31 6 views
12

私はフルーツのリストを照会し、そのフルーツのIDと名前だけを@fruitに集めています。選択したオプションを指定してタグを選択する(または配列要素をインデックス0に移動する)

[32, "apple"], 
[8, "bannana"], 
[10, "cantelope"], 
[11, "grape"], 
[15, "orange"], 
[41, "peach"], 
[22, "watermelon"] 

@ヘルパーで@fruitが使用されています。 @fruitのインデックス0にある "apple"は、selectの選択された値(最初のオプション)になります。これは作成された例ですが、デフォルトでは、 "オレンジ"は名前で表示されます(idではありません)。選択タグの選択値に "オレンジ"が必要です(最初のオプション)。

":prompt => 'orange'"は、セレクトに "オレンジ"の2番目のインスタンスを追加するだけです。これまで私がGoogleで見つけたことは、余分な価値や空白をリストに追加することにあるようだ。

配列のインデックス0は常に選択された値になります(選択ヘルパーでプロンプトまたは空白が使用されていない場合)、名前が "orange"(@fruit [x] .name == 'orange')、リストの残りの部分に既存のアルファソートを保持したままインデックス0に移動しますか?だから、@fruit配列は次のようになります。

@fruit[0] [15, "orange"], 
@fruit[1] [32, "apple"], 
@fruit[2] [8, "bannana"], 
@fruit[3] [10, "cantelope"], 
@fruit[4] [11, "grape"], 
@fruit[5] [41, "peach"], 
@fruit[6] [22, "watermelon"] 

私は今考えることができる唯一のことは、@fruitを通って、「オレンジ」が新しい配列に追加し発見された場合に繰り返すことであろう。次に@fruit配列を繰り返し処理し、 "orange"の名前を持たないものを追加します。私はそれをどのように書くか分からないが、それは私が探しているものをやるように思える。おそらく、これを行う簡単な方法がいくつかあります(配列のどのインデックスが最初に書き込まれるかを指定する)がありませんか?

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

答えて

16

はこちらをご覧ください:http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease

既存のヘルパーを使用する場合は、あなたが選択したいオプションidで指定することができます。具体的には、次の例です:

<%= options_for_select([['Lisbon', 1], ['Madrid', 2]], 2) %> 

output: 

<option value="1">Lisbon</option> 
<option value="2" selected="selected">Madrid</option> 

あなたは、どのオプションがIDで「オレンジ」であるのかわかりません。フルーツアレイで「オレンジ」のIDを検索したい場合は、ヘルパーを使用できます。

(@fruit.detect { |i| i[1] == 'orange' } || []).first 
+1

ありがとうございました!検出方法は本当に私を正しい方向に向けるのに役立ちました。サブ配列インデックス1と一致する検出メソッドと、サブ配列からインデックス0を返すことで問題が終了しました。検出メソッドに関する別の質問をした後、私はこれで終わりました( 'orange'を含むサブ配列を見つけて最後のインデックスを返します:<%= f.select:fruits_id、options_for_select(@fruit、@ fruit.assocオレンジ)。最後)%> – Reno

+0

は「最初の」赦免 – Reno

11

デフォルトのオプションを選択するために、選択タグにoptions_from_collection_for_selectを使用できます。例:

<%= select_tag 'state', 
    options_from_collection_for_select(@fruits, 'id', 'name', 15), 
    :include_blank => true %> 

これはデフォルトで「オレンジ」を選択します。 API Docs

関連する問題