Ruby on rails Rails:如何将嵌套表单保存到不同的嵌套模型?
上下文: 我有一个Ruby on rails Rails:如何将嵌套表单保存到不同的嵌套模型?,ruby-on-rails,associations,nested-forms,Ruby On Rails,Associations,Nested Forms,上下文: 我有一个公司模型,它有许多项目。每个项目都有许多任务。公司有许多员工 员工属于公司,有许多任务。每个任务一名员工,每个项目一名员工只有一个任务 模式: 问题: 我正在构建一个表单来创建一个项目,用户可以在其中添加多个任务。每个任务都指定了小时数,员工执行任务。提交后,表单应创建一个项目记录,一个或多个任务记录,具有小时和员工id属性,并(!)检查员工姓名是否已存在于数据库中,或创建一个新记录 我正在努力让表单保存employee\u id,而不是employee\u name 代码:
公司
模型,它有许多项目
。每个项目
都有许多任务
。公司
有许多员工
员工
属于公司
,有许多任务
。每个任务一名员工,每个项目一名员工只有一个任务
模式:
问题:
我正在构建一个表单来创建一个项目,用户可以在其中添加多个任务。每个任务都指定了小时数
,员工
执行任务
。提交后,表单应创建一个项目
记录,一个或多个任务
记录,具有小时
和员工id
属性,并(!)检查员工
姓名是否已存在于数据库中,或创建一个新记录
我正在努力让表单保存employee\u id
,而不是employee\u name
代码:
我的表格如下:
<%= simple_nested_form_for @project do |f| %>
<%= f.input :project_details %>
<%= f.simple_fields_for :tasks do |task| %>
<%= task.input :employee_name, input_html: { data: { autocomplete_source: @queried_employee_names.to_json } } %>
<%= task.input :hours %>
<% end %>
<%= f.link_to_add "Add +", :tasks %>
<%= f.button :submit %>
<% end %>
我的控制器:
class TransactionsController < ApplicationController
def new
@project = current_company.projects.build
end
def create
@project = current_company.projects.new(project_params)
if @project.save
employee_save
redirect_to success_url
else
@project = current_company.projects.build
render :new
end
end
# save the employees not yet in the database
def employee_save
@project.tasks.each do |task|
if current_company.employees.where(name: task.employee_name).empty?
current_company.employees.new(name: task.employee_name).save
end
end
end
def project_params
params.require(:project).permit(:project_details, tasks_attributes: [:id, :employee_name, :hours, :_destroy])
end
end
class TransactionController
问题:
不幸的是,这会将tasks
表中的employee\u name
而不是employee\u id
(加上将新的employee\u name
写入employees表中)。当然,tasks
表应该只包含employee\u id
和employee
表名称
有什么建议吗?我想以如下形式添加一个隐藏字段:
<%= simple_nested_form_for @project do |f| %>
<%= f.input :project_details %>
<%= f.simple_fields_for :tasks do |task| %>
<%= task.input :employee_name, input_html: { data: { autocomplete_source: @queried_employee_names.to_json } } %>
<%= task.hidden_field :employee_id, '' %>
<%= task.input :hours %>
<% end %>
<%= f.link_to_add "Add +", :tasks %>
<%= f.button :submit %>
<% end %>
此字段必须通过Ajax填写。我看到您的:employee_name
输入字段中有一个自动完成源代码,您可以在选择员工时在那里添加一个事件,通过Ajax获取id,并用所选员工的id填充隐藏字段,这样,您就可以在创建操作中轻松保存该数据。我会在表单中添加一个隐藏字段,如下所示:
<%= simple_nested_form_for @project do |f| %>
<%= f.input :project_details %>
<%= f.simple_fields_for :tasks do |task| %>
<%= task.input :employee_name, input_html: { data: { autocomplete_source: @queried_employee_names.to_json } } %>
<%= task.hidden_field :employee_id, '' %>
<%= task.input :hours %>
<% end %>
<%= f.link_to_add "Add +", :tasks %>
<%= f.button :submit %>
<% end %>
此字段必须通过Ajax填写。我看到您的:employee_name
输入字段中有一个自动完成的源代码,您可以在选择员工时在那里添加一个事件,通过Ajax获取id并用所选员工的id填充隐藏字段,这样您就可以轻松地将该数据保存在创建
操作中。谢谢。这听起来确实是一个解决办法。你对如何在控制器端处理这件事也有建议吗?这是一个老插曲,但对你来说很有用。很好的建议是观看Railscast。事实上,我发现了一个更近的版本,它更能描述这个问题。然而,还有一个遗留问题,即如何以这种方式将新的员工
记录链接到公司
。我已经描述过了。再次感谢!谢谢这听起来确实是一个解决办法。你对如何在控制器端处理这件事也有建议吗?这是一个老插曲,但对你来说很有用。很好的建议是观看Railscast。事实上,我发现了一个更近的版本,它更能描述这个问题。然而,还有一个遗留问题,即如何以这种方式将新的员工
记录链接到公司
。我已经描述过了。再次感谢!嗨,如果我的答案是有用的,请考虑选择它作为可接受的答案,这就是社区如何工作…嗨嗨,谢谢你的回答和你的时间。坦率地说,j-dexx的回答(评论)在这里是最有用的。您提到了使用隐藏字段,但最后我没有使用。如果你能总结一下下面提到的评论,我可能会接受。目前,它不是解决方案。干杯,迈尔斯我知道这不是完整的答案,但它可能对其他寻找同一主题的人有用,而不是因为它不仅对你有用意味着它不是一个有用的答案。如果我的答案是有用的,请考虑选择它作为可接受的答案,这就是社区的工作方式……嗨,无忧无虑,谢谢你的回答和你的时间。坦率地说,j-dexx的回答(评论)在这里是最有用的。您提到了使用隐藏字段,但最后我没有使用。如果你能总结一下下面提到的评论,我可能会接受。目前,它不是解决方案。干杯,迈尔斯我知道这不是完整的答案,但它可能对其他寻找同一主题的人有用,而不是因为它不仅对你有用意味着它不是一个有用的答案。当做