如何显示集合的额外属性复选框

时间:2013-11-21 12:16:13

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

如何显示集合中项目的更多详细信息复选框。我可以在我的表单中提供的唯一细节是复选框和由于标签助手的文本,我还想显示项目图片或项目描述等详细信息。

目前这就是我正在做的事情

      <%= 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 %>

上面的代码有效,但我不认为它是正确的方法。任何想法如何处理。谢谢。

1 个答案:

答案 0 :(得分:0)

两个建议。首先,我确保控制器正在为您加载所有LogoType对象。这是它的工作(SRP)。通过这样做,您将节省大量不必要的数据库访问。具体来说,在下面的代码中,第二行将LogoType从集合中拉出,而不是每次都按下DB。

<%= 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传递给部分为本地人。此选项可以使您的标记更具表现力。

<%= 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 %>