html - form_for called in a loop overloads IDs and associates fields and labels incorrectly -
rails likes giving of fields same ids when generated in loop, , causes trouble.
<% current_user.subscriptions.each |s| %> <div class="subscription_listing"> <%= link_to_function s.product.name, "toggle_delay(this)"%> in <%= s.calc_time_to_next_arrival %> days. <div class="modify_subscription"> <%= form_for s, :url => change_subscription_path(s) |f| %> <%= label_tag(:q, "days delay:") %> <%= text_field_tag(:query) %> <%= check_box_tag(:always) %> <%= label_tag(:always, "apply delay future orders") %> <%= submit_tag("change") %> <% end %> <%= link_to 'destroy', s, :confirm => 'are sure?', :method => :delete %> </div> </div> <% end %>
produces
<div class="subscription_listing"> <a href="#" onclick="toggle_delay(this); return false;">pasta</a> in 57 days. <div class="modify_subscription"> <form accept-charset="utf-8" action="/subscriptions/7/change" class="edit_subscription" id="edit_subscription_7" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="s5ljffuzmbemksrez8b3klvmdwn/pgmdryxhp25+qc4=" /></div> <label for="q">days delay:</label> <input id="query" name="query" type="text" /> <input id="always" name="always" type="checkbox" value="1" /> <label for="always">apply delay future orders</label> <input name="commit" type="submit" value="change" /> </form> <a href="/subscriptions/7" data-confirm="are sure?" data-method="delete" rel="nofollow">destroy</a> </div> </div> <div class="subscription_listing"> <a href="#" onclick="toggle_delay(this); return false;">gummy bears</a> in 57 days. <div class="modify_subscription"> <form accept-charset="utf-8" action="/subscriptions/8/change" class="edit_subscription" id="edit_subscription_8" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="s5ljffuzmbemksrez8b3klvmdwn/pgmdryxhp25+qc4=" /></div> <label for="q">days delay:</label> <input id="query" name="query" type="text" /> <input id="always" name="always" type="checkbox" value="1" /> <label for="always">apply delay future orders</label> <input name="commit" type="submit" value="change" /> </form> <a href="/subscriptions/8" data-confirm="are sure?" data-method="delete" rel="nofollow">destroy</a> </div> </div>
and that's problem because no matter "apply delay future orders" select helpfully checks first box me. how can override id without doing ugly , un-rails-like?
you should able override id passing in option
text_field_tag(:query, '', :id=>'unique id') check_box_tag(:always, '1', false, :id=>'unique_id')
for instance
<% current_user.subscriptions.each_with_index |s,i| %> <div class="subscription_listing"> <%= link_to_function s.product.name, "toggle_delay(this)"%> in <%= s.calc_time_to_next_arrival %> days. <div class="modify_subscription"> <%= form_for s, :url => change_subscription_path(s) |f| %> <%= label_tag("query_#{i}", "days delay:") %> <%= text_field_tag(:query, '', :id=>"query_#{i}") %> <%= check_box_tag(:always, '1', false, :id=>"always_#{i}") %> <%= label_tag("always_#{i}", "apply delay future orders") %> <%= submit_tag("change") %> <% end %> <%= link_to 'destroy', s, :confirm => 'are sure?', :method => :delete %> </div> </div> <% end %>
Comments
Post a Comment