2016-07-19 8 views
0

他のSO回答を読んだ後、いくつかの共通のテーマがあることは明らかです。Rails未定義のメソッド `map 'for nil:NilClass on collection_select - 呼び出される参照はnilである可能性があります

ほとんどの場合、このタイプのエラーは、呼び出されたオブジェクトがまだ定義されていない場合に発生しますが、この場合は選択を構築するときに参照されないエントリがある可能性があります。has_many

Class Tag 
    property :name, type: String 
    has_many :in, :tagged, type: :CONCEPTUAL_TAG, model_class: :Artefact 
end 

1つのオプションは、このような何かを行うことです。

<div class="field"> 
    <%= f.label :tagged_id %><br> 

    <% if [email protected]? %> 
    <%= f.collection_select(:tagged, Artefact.all.sort { |a,b| a.name <=> b.name }, :id, :name, options = {:prompt => "Please Select an Item", :selected => @tag.tagged.map(&:id)}, html_options = {:multiple => true, :class=>"search"}) %> 
    <% else %> 
    <%= f.collection_select(:tagged, Artefact.all.sort { |a,b| a.name <=> b.name }, :id, :name, options = {:prompt => "Please Select an Item"}, html_options = {:multiple => true, :class=>"search"}) %> 
    <% end %> 
</div> 

をしかし、これは間違いなくDRYではありません。

アソシエーションがない場合は何も選択しない方法はありますか?f.collection_selectを1つにしているときにあらかじめ入力してください。

+0

あなたの質問は、あなたが考えているようだとして明確かつ簡単ではありません。あなたがしようとしているものでそれを更新してみてください。また、あなたがテキスト本体の中でそれをするときにどんなエラーがありますか? – amingilani

+0

メタレベルでは、私はhas_many関係でドロップダウン選択を提供したいときにいつでも使用できる解決策に出ようとしています。 – joshfindit

答えて

0

ビューで条件を使用する必要はありません。何のアイテムが@tag.taggedに存在しない場合でも、それはまだActiveRecord::Relationインスタンスであるので、あなたは先に行くと、ちょうどそれにmapを呼び出すことができます。

<%= f.collection_select(:tagged, 
    Artefact.all.sort { |a,b| a.name <=> b.name }, 
    :id, 
    :name, 
    options = { 
    :prompt => "Please Select an Item", 
    :selected => @tag.tagged.map(&:id) 
    }, 
    html_options = { 
    :multiple => true, 
    :class=>"search" 
    }) 
%> 
+0

これはどこかのバグでした。あなたの答えが、期待どおりに動くはずだったことが明らかになったとき、私は新鮮なVMで新しいアプリを作りました。乾杯。 – joshfindit

関連する問題