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



如何在集合复选框中显示项目的更多详细信息。我可以在表单中提供的唯一详细信息是复选框和文本,因为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 %>

上面的代码有效,但我认为这不是正确的方法。有什么想法可以处理吗。非常感谢。

两个建议。首先,我要确保控制器正在为您加载所有LogoType对象。这就是它的工作(SRP)。通过这样做,您将节省许多不必要的DB之旅。具体来说,在下面的代码中,第二行将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中的everything封装到一个helper方法中。帮助程序可以接受logo_type和"b",并使用content_tag构建标记,或者呈现一个partial并将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 %>

最新更新