Rails:如何将嵌套表单保存到不同的嵌套模型?

时间:2016-02-17 23:20:30

标签: ruby-on-rails associations nested-forms

上下文

我的Company模型有很多projects。每个project都有许多taskscompany有很多employees

Employee属于Company且有许多tasks。每个任务只有一名员工,员工每task只有一个project

架构:

enter image description here

问题:

我正在构建一个表单来创建一个项目,用户可以在其中添加多个tasks。每项任务都指定了hours,执行employee的{​​{1}}。提交后,表单应创建一条task条记录,一条或多条带有projecttask属性的hours条记录,并且(!)会检查employee_id名称已经存在于数据库中或创建一个新的。

我正在努力解决如何保存表单employee而不是employee_id

代码:

我的表格如下:

employee_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 表格保存到tasks而不是employee_name(再加上employee_id写入employee_name。当然,employees table表应该只包含tasksemployee_idsemployee

有关如何处理此事的任何建议?

1 个答案:

答案 0 :(得分:0)

我会在表单中添加隐藏字段,如:

<%= 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填充隐藏字段,您可以在create操作中轻松保存这些数据。