Weird looping behaviour - what's happening here?

孤人 提交于 2019-12-25 08:10:38

问题


Gotten myself all confused with what I think is a double loop and don't know how to fix it. Can anyone save me from going completely mad please?

This works in my show view:

<% @releases_tracks_temp.each do |releases_track| %>
  <tr>
    <td><%= releases_track.track.id %> / <%= releases_track.position %></td>
    <td><%= releases_track.track.name %>
        <%= releases_track.track.artists.map { |a| a.name}.join (", ") %></td>
    <td><%= releases_track.track.isrc %></td>
    <td><%#= link_to image_tag("icons/delete.png"), releases_track, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>

I'm trying to render a form for multiple tracks with a custom action and view using:

<%= form_for @release do |f| %>
  <%= f.fields_for :tracks do |builder| %>
     <%= render 'track_fields', :f => builder %>
  <% end %>
  <%= link_to_add_fields "Add track", f, :tracks %>

Then the fields themselves:

<% @releases_tracks_temp.each do |releases_track| %>
  <%= f.text_field :name, :class => "text" %>
  <%= f.text_field :artist_tokens, "data-pre" => releases_track.track.artists.map(&:attributes).to_json, :class => "track_artist_tokens" %>
  <%= f.text_field :version, :class => "text" %>
  <%= f.text_field :isrc, :class => "text" %>
  <%= f.select(:asset_tier, options_for_select([['Front', 'Front'], ['Mid', 'Mid'], ['Back', 'Back']]), {}, :class => "tier-select") %>
  <%= f.text_field :preview_start, :class => "text small" %>
  <%= f.check_box :parental_advisory %>
  <%= f.check_box :available_separately, {:checked => true} %>
  <%= f.check_box :_destroy %>
<% end %>

I end up getting it looping however many tracks there are by that number, for example 5 tracks are displayed 5 times! So 25 results. I think I see a double loop but i'm not sure how to fix this and still have access to the (multiple) artists for each track via:

releases_track.track.artists.map(&:attributes)

Any ideas?

Oh, @releases_tracks_temp is defined in my releases controller as:

 @releases_tracks_temp = @release.releases_tracks.find(:all, :order => "position") 

Tracks are accepted as nested under releases.

Thanks in advance!!!


回答1:


For each release, for each track print the list. No need to loop over tracks twice

Have one form instead of 2

<%= form_for @release do |f| %>
  <%#= f.fields_for :tracks do |builder| %>
    <%= render 'track_fields', :f => f %>
  <%# end %>
<% end %>

Edit - Try it this way

<%= form_for([@release, @release.tracks.build]) do |f| %>
  <%= f.text_field :name, :class => "text" %>
  <%= f.text_field :artist_tokens, "data-pre" => releases_track.track.artists.map(&:attributes).to_json, :class => "track_artist_tokens" %>
  <%= f.text_field :version, :class => "text" %>
  <%= f.text_field :isrc, :class => "text" %>
  <%= f.select(:asset_tier, options_for_select([['Front', 'Front'], ['Mid', 'Mid'], ['Back', 'Back']]), {}, :class => "tier-select") %>
  <%= f.text_field :preview_start, :class => "text small" %>
  <%= f.check_box :parental_advisory %>
  <%= f.check_box :available_separately, {:checked => true} %>
  <%= f.check_box :_destroy %>

  <%= link_to_add_fields "Add track", f, :tracks %>
<% end %>


来源:https://stackoverflow.com/questions/10387559/weird-looping-behaviour-whats-happening-here

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!