Дублирование полей формы при использовании fields_for

Я пытаюсь создать вложенную форму для обработки отношений has_many :through и получения дублирующихся полей.

Модели

Компания

has_many :provides
has_many :services, :through => :provides
accepts_nested_attributes_for :services, :provides
attr_accessible :service_ids

Предоставлять

belongs_to :company
belongs_to :service

обслуживание

has_many :provides
has_many :companies, :through => :provides
has_many :portfolio_items
acts_as_nested_set

Контроллер

Настройки/Сервисы

def index
  @company_services = @company.services
  @service_list = Service.where("parent_id IS NULL")
end

def show
  @user = current_user

  # Find features for supplier based users
  unless @company.blank?
   @my_sectors = @company.sectors
  end
end

def update

if params[:company].nil?
  @company.service_ids = nil
end
respond_to do |format|
  if @company.update_attributes(params[:company])
    format.html { redirect_to settings_path, :notice => "Services successfully updated" }
  else
    format.html { render :index }
  end
 end
end

Просмотры

Форма -

<%= form_for @company, :url => settings_service_path(@company), :method => :put do |f| %>
<div>
<ul>
<% @service_list.each do |item| %>
    <%= f.fields_for :provides do |p|  %>
        <%= p.fields_for :services do |s|  %>
            <%= render :partial => "subs", :locals => {:subs => s, :service => item, :f => f, :p => p } %>
        <% end %>
    <% end %>
<% end %>
</ul>
<%= submit_tag("Update") %>
<% end %>

_subs.html.erb

<li>
<%= check_box_tag :service_ids, service.id, @company.services.include?(service), :name => "company[service_ids][]", :class => "checkbox" %>
<%= label_tag service.id, service.service_name %>

<% unless service.children.blank? %>
    <ul>
        <%= render :partial => "subs", :collection => service.children %>
    </ul>
<% end %>
</li>

Я знаю, что fields_for вызывает дублирование, но не знаю почему?

Кто-нибудь может уточнить?


person Edward Ford    schedule 01.05.2011    source источник
comment
Это странно, если я сохраняю 3 записи, каждая строка повторяется 3 раза.   -  person Edward Ford    schedule 02.05.2011
comment
Хорошо, после перемещения fields_for за пределы каждого цикла у меня появилось больше ясности. fields_for также зацикливает существующие отношения. Это не работает для меня, так как мне нужно показать все флажки службы, независимо от того, отмечены они или нет.   -  person Edward Ford    schedule 02.05.2011


Ответы (1)


Вам нужно написать,

<% @service_list.each do |item| %>
  <%= f.fields_for :provides do |p| %>
   <%= p.fields_for :services, item do |s| %>

Таким образом, fields_for каждый раз будет выполнять итерацию только для соответствующей службы.

person maximus ツ    schedule 02.08.2013
comment
Я использую аналогичную настройку и сохраняю свою форму, но поля формы все еще дублируются, когда возникает ошибка проверки и новое действие отображается повторно. Любые идеи? - person Mike Doyle; 09.02.2014