2013-11-21 64 views
0

如何顯示集合中項目的更多詳細信息複選框。我可以在我的表單中提供的唯一詳細信息是複選框和Tag幫助程序中的文本,我還希望顯示詳細信息,如項目的圖片或項目的說明。如何顯示集合的額外屬性複選框

目前,這是我在做什麼

 <%= f.collection_check_boxes(
        :logo_type_ids, LogoType.all, :id, :name, allow_destroy: true 
     ) do |b, c| %> 
      <div class="col-sm-6 col-md-4"> 
      <% logo_type = LogoType.where(id: b.value).first %> 
      <div class="thumbnail"> 
       <%= image_tag(logo_type.example(:original)) %> 
       <div class="caption"> 
       <h3><%= b.label { b.check_box + b.text } %></h3> 
       <p><%= logo_type.description %></p> 
       </div> 
      </div> 
      </div> 
     <% end %> 

上述工程的代碼,但我不認爲它是正確的做法。任何想法如何處理。謝謝。

回答

0

兩個建議。首先,我要確保控制器正在爲您加載所有的LogoType對象。這是它的工作(SRP)。通過這樣做,您可以節省大量不必要的數據到數據庫。具體來說,在下面的代碼中,第二行將LogoType從集合中拉出,而不是每次都擊中數據庫。

<%= f.collection_check_boxes(:logo_type_ids, @logo_types, :id, :name, allow_destroy: true) do |b, c| %> 
    <% logo_type = @logo_types.detect{|logo| logo.id == b.value } %> 
    <div class="col-sm-6 col-md-4"> 
    <div class="thumbnail"> 
     <%= image_tag(logo_type.example %> 
     <div class="caption"> 
     <h3><%= b.label { b.check_box + b.text } %></h3> 
     <p><%= logo_type.description %></p> 
     </div> 
    </div> 
    </div> 
<% end %> 

其次,我會認真考慮包裝一切在最外面的div到一個輔助方法。助手可以接受logo_type和'b',並使用content_tag構建標記,或者渲染局部,並將logo_type和b作爲局部變量傳遞給partial。這個選項會讓你的標記更具表現力。

<%= f.collection_check_boxes(:logo_type_ids, @logo_types, :id, :name, allow_destroy: true) do |b, c| %> 
    <% logo_type = @logo_types.detect{|logo| logo.id == b.value } %> 
    <%= logo_type_collection_checkbox logo_type, b %> 
<% end %>