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