Поля вложенной формы Rails для удвоения при редактировании

#ruby-on-rails #ruby-on-rails-4 #erb #nested-forms #nested-attributes

#ruby-on-rails #ruby-on-rails-4 #erb #вложенные формы #вложенные атрибуты

Вопрос:

Я пытаюсь создать форму, в которой пользователи могут видеть список своих друзей и добавлять или удалять друзей из списков (вроде как группы facebook). Для представления списка создания я могу заставить форму работать должным образом, но для представления редактирования у меня возникают проблемы с синтаксисом check_box и fields_for.

 routes.rb
  resources :friendships
  resources :friend_lists

class User < ActiveRecord::Base
has_many :friendships, dependent: :destroy
  has_many :friends, through: :friendships
  has_many :friend_lists
  has_many :flist_memberships, class_name: 'FlistMembership', foreign_key: 'member_id', dependent: :destroy
...
end

class FriendList < ActiveRecord::Base
  belongs_to :user
  has_many :flist_memberships
  has_many :members, through: :flist_memberships

  accepts_nested_attributes_for :members, allow_destroy: true
  accepts_nested_attributes_for :flist_memberships, allow_destroy: true
end

class FlistMembership < ActiveRecord::Base
  belongs_to :friend_list
  belongs_to :member, class_name: 'User'
end

class FriendListsController < ApplicationController
  def new
    @friend_list = current_user.friend_lists.build
    @friends = current_user.friends.paginate(page: params[:page])
    @friend_list.flist_memberships.build
  end

  def create
    @friend_list = current_user.friend_lists.build(friend_list_params)
    respond_to do |format|
        format.html {
          if @friend_list.save
            flash[:success] = "Friends list created!"
            redirect_to friendships_path
          else
            render 'friend_lists/new'
          end
          }
      end
  end

  def edit
    @friend_list = FriendList.find(params[:id])
    @friends = current_user.friends
  end

  def update
    @friend_list = FriendList.find(params[:id])
    if @friend_list.update_attributes(friend_list_params)
      flash[:success] = "Friend list updated!"
      redirect_to friend_list_path(@friend_list)
    else
      render 'edit'
    end
  end

  private

  def friend_list_params
    params.require(:friend_list).permit(:name, flist_memberships_attributes: [:id, :member_id, :friend_list_id])
  end
end
  

new.html.erb

 <%= form_for @friend_list do |f| %>
  <%= f.label :name, "Name for this friends list:" %>
  <%= f.text_field :name %>
  <% @friends.each do |friend| %>
    <%= f.fields_for :flist_memberships do |m| %>
      <%= m.check_box :member_id, {}, friend.id %>
      <%= m.label :member_id, friend.name %>
    <% end %>
  <% end %>
  <%= f.submit "Save", class: "btn btn-primary" %>
<% end %>
  

edit.html.erb

 <%= form_for @friend_list do |f| %>
  <%= f.label :name, "Name for this friends list:" %>
  <%= f.text_field :name %>
  <%= f.fields_for :flist_memberships do |m| %>
    <%= m.collection_check_boxes(:member_id, @friends.all, :id, :name) %>
  <% end %>
  <%= f.submit "Save", class: "btn btn-primary" %>
<% end %>
  

new.html.erb правильно отображает и сохраняет выбранные элементы, но я не могу понять, как написать форму редактирования, чтобы она не выполняла итерацию по коллекции один раз для каждого элемента в коллекции (как с помощью collection_check_boxes, так и с формой, как написано в new.html.erb). Попытка

 <%= f.fields_for :flist_memberships do |m| %>
  <%= m.check_box :id %>
  <%= m.label :id, :name %>
<% end %>
  

в форме редактирования просто передается строка «id» в качестве параметров, а не извлекается идентификатор каждого элемента в коллекции, и я не уверен, как извлечь имя / идентификатор отдельного элемента без итерации по коллекции, что восходит к проблеме множественного отображения. Я использую cocoon в другом месте проекта, но для этого я бы предпочел представить пользователю список всех параметров и разрешить им устанавливать флажок для каждого из них, вместо того, чтобы вручную добавлять каждый элемент в список. Если есть способ сделать это с помощью cocoon, я был бы рад это услышать.

Комментарии:

1. Ты когда-нибудь понимал это?