在Rails上批量编辑(创建/销毁)many2many关系

时间:2016-11-02 19:34:21

标签: ruby-on-rails ruby

我在Rails 5上完成了这项任务。

我需要"质量"修改Project及其Members

之间的关系

在用户界面中,我打开一个包含特定成员列表的弹出窗口(User列表),这些成员已经或不属于Project(请查看此处的关系)。

我需要能够使用复选框标记其中一些(不属于)或取消标记其他人(属于谁)和"保存"表格和创建/删除关系。

为了记录我有这个模型

// project.rb

class Project < ApplicationRecord
     has_many :memberships, dependent: :destroy, class_name: 'ProjectMember'
     has_many :members, through: :memberships, class_name: 'User', source: :user
end


// project_member.rb

class ProjectMember < ApplicationRecord
    belongs_to :user
    belongs_to :project
end

// user.rb
class User < ApplicationRecord
    has_many    :project_members
    has_many    :projects, through: :project_members
end

我在Rails上有点新鲜,我真的很喜欢创建表单(使用SimpleForms)以及如何编辑关系。

什么是正确的做法?我试图在网上找不到成功:(

我希望我的问题很清楚:)。

1 个答案:

答案 0 :(得分:0)

我认为你想要的助手包含在宝石茧中:https://github.com/nathanvda/cocoon

使用此gem,您对项目版本的看法如下所示:

项目/ _form

= simple_form_for @project do |f|
  -# your project fields... 
  %h3 Members
  #members
    = f.simple_fields_for :members do |member|
      = render 'member_fields', f: member
    .links
      = link_to_add_association 'add member', f, :members
  = f.submit

项目/ _member_fields

.nested-fields
  = f.association :user
  = link_to_remove_association "remove user from project", f

编辑:我专注于视图部分,但在此之前,在模型中,您必须接受表单中的嵌套属性:

class Project < ApplicationRecord
  has_many :memberships, dependent: :destroy, class_name: 'ProjectMember'
  has_many :members, through: :memberships, class_name: 'User', source: :user
  accepts_nested_attributes_for :members, reject_if: :all_blank, allow_destroy: true
end

在控制器中还有一些工作要做,以允许嵌套属性。

def project_params
  params.require(:project).permit(:name, :description, members_attributes: [:id, :user_id, :_destroy])
end