使用嵌套方法一次性使用form_with保存多条记录

Save multiple records using form_with in one go using nested approach

提问人:Muhammad Ans 提问时间:9/6/2022 最后编辑:Muhammad Ans 更新时间:9/6/2022 访问量:90

问:

我正在做一个项目,其中有两个模型,(用户,项目)。它们具有多对多关系,并由 has_many 实现,通过 (UserProject)。 我想要这样的功能,即当我创建项目时,在项目模型字段下方,所有数据库用户都应该在下面列出,每个用户前面都有复选框。当用户输入所有项目模型字段并选中复选框(例如下面的 2 个复选框(2 个用户)时,应保存所有数据,包括项目创建以及 UserProject 的两条记录。 有什么办法可以做到这一点吗? 我正在使用form_with帮手。 用户(ID,电子邮件,密码) 项目(id,name) 用户项目 (id,user_id,project_id)

Ruby-on-Rails Ruby 嵌套 表单助手

评论

0赞 Jad 9/6/2022
您能向我们展示您到目前为止尝试过的代码示例吗?
0赞 Muhammad Ans 9/6/2022
@Jad我没有尝试过,但实际上我在被指示这样做之前使用了另一种方法。我到处寻找,但没有找到适合的场景。大多数发现的结果是一对多的例子。

答:

0赞 Jad 9/6/2022 #1

如果我理解正确的话,你想要一个包含子对象和单个提交的表单。

我过去曾通过ing空对象来做到这一点,以便它们可以在表单中显示,然后在params部分中“正确”处理它们:#build

控制器:

class MeetTypesController < ApplicationController

  def new
    @meet_type = MeetType.new

    Job.all.each do |job|
      @meet_type.meet_type_jobs.build(job: job, count: 0)
    end
    @meet_type.meet_type_jobs.sort_by{ |mtj| mtj.job.name }
  end

  def create
    @meet_type = MeetType.new(meet_type_params)

    if @meet_type.save
      redirect_to meet_types_path
    else
      render 'new'
    end
  end

  def edit
    (Job.all - @meet_type.jobs).each do |job|
      @meet_type.meet_type_jobs.build(job: job, count: 0)
    end
    @meet_type.meet_type_jobs.sort_by{ |mtj| mtj.job.name }
  end

  def update
    if @meet_type.update(meet_type_params)
      redirect_to meet_types_path
    else
      render 'edit'
    end
  end

  def show; end

  def index
    @meet_types = MeetType.in_order
  end

  private

  def meet_type_params
    params.require(:meet_type).permit(:name, meet_type_jobs_attributes: [:id, :job_id, :count])
  end
end

视图:

%h1 Editing Meet Type
= bootstrap_form_for(@meet_type, layout: :horizontal) do |f|
  = f.text_field :name, autocomplete: :off
  %h2 Count of Jobs
  = f.fields_for :meet_type_jobs do |jf|
    = jf.hidden_field :job_id
    = jf.number_field :count, label: jf.object.job.name, step: 1, in: 0..5
  = f.form_group do
    = f.primary
%para
= errors_for @meet_type

我希望这会有所帮助。