2009-03-30 14 views
12

collection_selectヘルパーメソッドで作成した<select>の末尾に<option>を追加することはできますか?Railsのcollection_selectヘルパーメソッドと最後の "アイテム作成"オプション

今私は

<select id="product_category_id" name="product[category_id]"> 
    <option value="">Please select a category</option> 
    <option value="7">category one</option> 
    <option value="8">category 2</option> 
</select> 

と、私は希望

<select id="product_category_id" name="product[category_id]"> 
    <option value="">Please select a category</option> 
    <option value="7">category one</option> 
    <option value="8">category 2</option> 
    <option value="new">..or create a new one</option> 
</select> 

が可能これですかコレクションをする必要があり、私はちょうどループと生成を生成

f.collection_select(:category_id , @categories, :id, :name, {:prompt => 'Please select a category'}) 

を持っていますオプションは手動で?

答えて

11

おそらくselectを使用してください。そのよう

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [ [ 'Or create a new one', 'new' ] ], {:include_blank => 'Please select a category'}) 

幸運!

ERB内の次の行をラップ:いいえと長い答えは「狡猾う」短い答えに合意したが、ここで私はちょうど私がこれら二つのソリューションのいずれかよりも簡単だと思うどの行なったし、私のために働いたものだ

+0

umm ..これは2つの追加オプションを作成します。どちらも名前と値が等しいか、「新しいものを作成する」と「新規」 – andi

+0

配列の代わりにハッシュ["name"、 "新しいものを作成"、 "id"、 "new"]を試みましたが、 "ハッシュを配列に変換できません" – andi

+0

これはそうですが、オプション内のテキストとは異なる値を設定する方法に関するアイデアはありますか? – andi

0

短い回答:いいえ。

長い答え:確かに、あなたは狡猾でなければなりません。

  • そうのようなクラスを作成します。あなたがterser何かを探している(コメントで示されている)場合@categories+New_option_placeholder.new

を渡す代わりに、@categoriesを渡すの

class New_option_placeholder 
    def id 
    "new" 
    end 

    def name 
    "...or create a new one" 
    end 
end 
  • require "ostruct"を入力してから、@categories + [OpenStruct.new(:id => 'new',:name => '...or create a new one')]を渡して本質的に同じ結果を達成できます。

  • +0

    これはおそらくうまくいくかもしれませんが、回避策が余りにも多いので、私はGdeglinの解決策に行くと思います。それでも私が望んだことがあるからです。 – andi

    +0

    Gdeglinのソリューションがうまく動作するようになると、これよりも動く部分があるでしょう。 1行のバージョンを探しているのなら、私は1つを追加します... – MarkusQ

    3

    タグは<%=%>、すなわち:

    f.collection_select :advertisement_group_id, AdvertisementGroup.find(:all, :order => "name DESC") << AdvertisementGroup.new(:name => "New Group"), :id, :name, :include_blank => true 
    

    だけ.newで新しいオブジェクトを作成し、:include_blank => trueと共に表示好きなテキストを渡します。

    1

    私は上記の答えにこれを追加したいと思います。

    []は、追加オプションの周り

    f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [['Or create a new one','new']], {:include_blank => 'Please select a category'}) 
    

    ノート行う代わりに

    f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + ['Or create a new one','new'], {:include_blank => 'Please select a category'}) 
    

    の.. "新" option->の値を取得する "または新規作成" します。これにより、配列がオプションの値ペアとして動作するようになります

    関連する問題