2011-02-18 2 views
1

레일은 루프에서 생성 될 때 모든 필드에 동일한 ID를 제공하기를 좋아하므로 문제가 발생합니다.루프에서 호출 된 form_for가 ID를 오버로드하여 필드와 레이블을 잘못 연결합니다.

<% current_user.subscriptions.each do |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) do |f| %> 
      <%= label_tag(:q, "Days to delay:") %> 
      <%= text_field_tag(:query) %> 
      <%= check_box_tag(:always) %> 
      <%= label_tag(:always, "Apply delay to all future orders") %> 
      <%= submit_tag("Change") %> 
     <% end %> 
     <%= link_to 'Destroy', s, :confirm => 'Are you sure?', :method => :delete %> 
    </div> 
    </div> 
<% end %> 

<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="&#x2713;" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="s5LJffuzmbEMkSrez8b3KLVmDWN/PGmDryXhp25+qc4=" /></div> 

      <label for="q">Days to delay:</label> 
      <input id="query" name="query" type="text" /> 
      <input id="always" name="always" type="checkbox" value="1" /> 
      <label for="always">Apply delay to all future orders</label> 
      <input name="commit" type="submit" value="Change" /> 
</form>  <a href="/subscriptions/7" data-confirm="Are you 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="&#x2713;" /><input name="_method" type="hidden" value="put" /><input name="authenticity_token" type="hidden" value="s5LJffuzmbEMkSrez8b3KLVmDWN/PGmDryXhp25+qc4=" /></div> 
      <label for="q">Days to delay:</label> 
      <input id="query" name="query" type="text" /> 

      <input id="always" name="always" type="checkbox" value="1" /> 
      <label for="always">Apply delay to all future orders</label> 
      <input name="commit" type="submit" value="Change" /> 
</form>  <a href="/subscriptions/8" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a> 
    </div> 
    </div> 

을 생산하고 지금은 항상 선택 "이후의 모든 주문에 지연을 적용"에 상관없이 매우 유용하게 나를 위해 첫 번째 상자를 확인하기 때문에이 문제입니다. 어떻게 추악한 un-rails 같은 것을하지 않고 ID를 무시할 수 있습니까?

답변

1

당신은 예를 들어 옵션

text_field_tag(:query, '', :id=>'unique id') 
check_box_tag(:always, '1', false, :id=>'unique_id') 

로 전달하여 ID를 오버라이드 (override) 할 수 있어야한다

<% current_user.subscriptions.each_with_index do |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) do |f| %> 
      <%= label_tag("query_#{i}", "Days to delay:") %> 
      <%= text_field_tag(:query, '', :id=>"query_#{i}") %> 
      <%= check_box_tag(:always, '1', false, :id=>"always_#{i}") %> 
      <%= label_tag("always_#{i}", "Apply delay to all future orders") %> 
      <%= submit_tag("Change") %> 
     <% end %> 
     <%= link_to 'Destroy', s, :confirm => 'Are you sure?', :method => :delete %> 
    </div> 
    </div> 
<% end %> 
관련 문제