提问人:Muhammad Ans 提问时间:9/6/2022 最后编辑:Muhammad Ans 更新时间:9/6/2022 访问量:90
使用嵌套方法一次性使用form_with保存多条记录
Save multiple records using form_with in one go using nested approach
问:
我正在做一个项目,其中有两个模型,(用户,项目)。它们具有多对多关系,并由 has_many 实现,通过 (UserProject)。 我想要这样的功能,即当我创建项目时,在项目模型字段下方,所有数据库用户都应该在下面列出,每个用户前面都有复选框。当用户输入所有项目模型字段并选中复选框(例如下面的 2 个复选框(2 个用户)时,应保存所有数据,包括项目创建以及 UserProject 的两条记录。 有什么办法可以做到这一点吗? 我正在使用form_with帮手。 用户(ID,电子邮件,密码) 项目(id,name) 用户项目 (id,user_id,project_id)
答:
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
我希望这会有所帮助。
评论