2011-01-02 7 views
1

私はRails 3を使用しています。オプションは次のようになります。いくつかのオプションをグループ化して選択タグを作成し、グループ化しないものを選択します。

Income 
Auto 
    Fuel 
    Maintenance 
Home 
    Maintenance 
    Mortgage 

この例では、所得はグループではありませんが、自動と家はあります。

私はヘルパーメソッドgrouped_options_for_selectgrouped_collection_selectoption_groups_from_collection_for_selectの3つのヘルパーメソッドを参照していますが、すべてのオプションにグループが必要です。

これを行うためにヘルパーを使用する方法はありますか、自分でHTMLを生成する必要はありますか? 2つの異なるヘルパーを使用してオプションを作成し、両方の結果を追加することができると思います。

答えて

2

あなたが必要とすることができる既製のヘルパー(私が知っている)はありません。それはあなたのデータモデルに依存するので、やや難しいです。それは配列、ハッシュ、親子、または多対多の関係ですか?

それが親子だ、あなたはそれを構築するために再帰を使用できると仮定すると:あなたのビューで

def child_options_for_select(collection, children_method, group_label_method, child_value_method, child_label_method, options = {}) 
    body = '' 
    collection.each do |item| 
    children = item.send(children_method) 
    if item.children.count != 0 
     body << content_tag(:optgroup, child_options_for_select(children, children_method, group_label_method, child_value_method, child_label_method, options), :label => item.send(group_label_method)) 
    else 
     body << content_tag(:option, item.send(child_label_method), :value => item.send(child_value_method)) 
    end 
    end 
    body.html_safe 
end 

使用例:

<%= select_tag 'foo', child_options_for_select(@categories.roots, :children, :to_s, :id, :to_s) %> 

注それはいくつかのラウンドを必要とするよう、これはかなり遅いことデータベースへのトリップ。

+0

ニース。それ以来、私はあなたが提案したものに似た何かをやってしまった。答えをありがとう! 1つのクエリで必要なすべてのデータを 'インクルードする 'ことは遅くはありません。 – dontangg

0

Aaronsの回答を出発点として、Hashを入力としたバージョンを作成しました。

def grouped_and_ungrouped_options_for_select(grouped_options, selected_key = nil) 
    body = '' 
    grouped_options.each do |key, value| 
     selected = selected_key == value 
     if value.is_a?(Hash) 
     body << content_tag(:optgroup, grouped_and_ungrouped_options_for_select(value, selected_key), :label => key) 
     else 
     body << content_tag(:option, key, value: value, selected: selected) 
     end 
    end 
    body.html_safe 
    end 
関連する問題