#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. Ты когда-нибудь понимал это?