导轨:嵌套形式,创建多个子记录



我正在尝试在SNS应用程序中创建一个具有多个用户的组。group has_many用户通过groups_users。

在这里,我有一个形式来创建一个组,我想同时将成员(groups_users)添加到组。我成功地将一个成员添加到小组中的同时,但我只是无法在小组中添加几个成员。

这是我的代码:

模型:

group.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

视图:

groups/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

注意:

  • 如果我从视图文件中删除{procorts:true},则可以同时添加几个成员。
  • 我正在使用设计宝石,所以current_user是登录的用户。
  • mutual_followers:您正在关注的用户也关注您(在我的用户中定义了。

我认为我的代码不起作用,因为我将一系列User_ids插入一个user_id,但我不知道如何解决此问题。

P.S。我在这里找到了一个类似的问题:Rails4中的嵌套简单形式 - 有许多通过,保存多个记录

但是,由于我不使用simple_form,我找不到解决问题的方法,而且我无法弄清楚如何弥补form_for的差异。

解决此问题的一种简单方法是使用Nested_form Gem。https://github.com/ryanb/nested_form

如果使用它,则可以通过像以下的编码来添加或删除Nested_forms。

<%= 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>

宝石的读数很容易理解,因此您也应该检查一下。

另外,如果您查看宝石提供的Wiki,您可以知道如何自定义您的表格。

相关内容

  • 没有找到相关文章

最新更新