Rails: вложенная форма, создание нескольких дочерних записей

Я пытаюсь создать группу в приложении SNS, в которой есть несколько пользователей. Группа has_many Users через Groups_users.

Здесь у меня есть форма для создания группы, и я хочу одновременно добавить участников (Groups_users) в группу. Мне удалось добавить одного участника в группу одновременно с созданием группы, но я просто не могу добавить в группу нескольких участников.

Вот мой код:

Модели:

группа.rb

class Group < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  validates :owner_user_id, presence: true
  has_many :groups_users, inverse_of: :group
  has_many :users, through: :groups_users
  accepts_nested_attributes_for :groups_users
  has_many :group_posts
end

groups_user.rb

class GroupsUser < ApplicationRecord
  belongs_to :group, inverse_of: :groups_users
  belongs_to :user
  validates :group, presence: true
  validates :user_id, presence: true
end

Контроллеры:

groups_controller.rb

module Users
  module Users
    class GroupsController < BaseController
      def index
        @group = Group.new
        @group.groups_users.build
        @groups = Group.all
      end

      def create
        group = Group.new(group_params)
        if group.save!
          redirect_to users_groups_path, notice: 'a new group created!'
        else
          redirect_to users_groups_path, notice: 'The selected group name has already been taken.'
        end
      end

      private

        def group_params
          params.require(:group).permit(:name, :owner_user_id, groups_users_attributes: [:user_id])
        end
    end
  end
end

Взгляды:

группы/index.html.slim

= form_for [:users, @group] do |f|
  .field
    = f.label :name, 'group name:'
    = f.text_field :name, size: 15, maxlength: 20
    = f.hidden_field :owner_user_id, value: current_user.id
  .field
    = f.fields_for :groups_users do |g|
      = g.label :user_id, 'user name you want to add'
      = g.select :user_id, options_for_select(current_user.mutual_followers.map { |user| [user.name, user.id] }), {  }, { multiple: true }

  .actions
    = f.submit

Примечание:

  • Если я удалю {multiple: true} из файла представления, это сработает, но я хочу добавить несколько участников одновременно.
  • Я использую devise gem, поэтому current_user — это пользователь, вошедший в систему.
  • взаимные_фолловеры: пользователь, за которым вы следите, который также следит за вами (определено в моем User.rb, но я не хочу делать свой вопрос слишком длинным).

Я думаю, что мой код не работает, потому что я вставляю массив user_id как один user_id, но я не знаю, как решить эту проблему.

P.S. Я нашел аналогичный вопрос здесь: Вложенная простая форма в Rails4 — много проходов, сохранение нескольких записей

Однако я не мог понять, как решить свою проблему, поскольку я не использую simple_form, и я не мог понять, как компенсировать эту разницу в form_for.


person t.kengo    schedule 28.02.2017    source источник


Ответы (1)


Один из простых способов решить эту проблему — использовать гем nested_form. https://github.com/ryanb/nested_form

Если вы используете его, вы можете добавлять или удалять вложенные_формы, просто написав код, как показано ниже.

<%= f.fields_for :tasks do |task_form| %>
  <%= task_form.text_field :name %>
  <%= task_form.link_to_remove "Remove this task" %>
<% end %>
<p><%= f.link_to_add "Add a task", :tasks %></p>

README драгоценного камня довольно прост для понимания, поэтому вам также следует проверить его.

Кроме того, если вы посмотрите на вики, которую предоставляет gem, вы узнаете, как настроить свои формы по своему усмотрению.

person t.kengo    schedule 10.03.2017