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



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

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

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

控制器:

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

我希望这能有所帮助。

最新更新