app/views/spree/products/show/_parts.html.erb
<% if @product.assemblies_parts.any? %>
<div class="columns col-lg-12">
<h6><%= Spree.t(:parts_included) %></h6>
<% @product.variants_or_master.each do |variant| %>
<ul id="products" class="inline product-listing list-unstyled assemblies_variant assemblies_for_variant_<%= variant.id %>" data-hook style='display:none;'>
<% variant.parts_variants.includes(:part).each do |part_variant| %>
<%- part = part_variant.part %>
<li id="product_<%= part.product.id %>" class="columns three <%= cycle("alpha", "secondary", "", "omega secondary") %>" data-hook="products_list_item" itemscope itemtype="http://schema.org/Product">
<div class="product-image">
<%= link_to small_image(part.product, itemprop: "name"), part.product %>
</div>
<%= link_to truncate(part.product.name, length: 50), part.product, class: 'info', itemprop: "name", title: part.product.name %>
<%- if !part.in_stock? && !part_variant.variant_selection_deferred? %>
<%- if part.is_backorderable? %>
<div class="on-backorder"><%= Spree.t(:backorderable) %></div>
<%- else %>
<div class="out-of-stock"><%= Spree.t(:out_of_stock) %></div>
<%- end %>
<%- end %>
<%- if part_variant.variant_selection_deferred? %>
<div class="variant-selection-deferred">
<%- product = part.product %>
<%= label_tag "options_selected_variants_#{part.id}", Spree.t(:variant) %>
<%- opts = product.variants.map { |v| [v.options_text, v.id] } %>
<%- opts_disabled = product.variants.each_with_object([]) { |v, o| o << v.id if !v.in_stock? && !v.is_backorderable? } %>
<%= select_tag "options[selected_variants][#{part.id}]", options_for_select(opts, disabled: opts_disabled)%>
</div>
<%- end %>
</li>
<% end %>
</ul>
<% end %>
</div>
<% end %>