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的回答(评论)在这里是最有用的。您提到了使用隐藏字段,但最后我没有使用。如果你能总结一下下面提到的评论,我可能会接受。目前,它不是解决方案。干杯,迈尔斯我知道这不是完整的答案,但它可能对其他寻找同一主题的人有用,而不是因为它不仅对你有用意味着它不是一个有用的答案。当做