Ruby on rails 在创建父对象的同时创建多个子对象

Ruby on rails 在创建父对象的同时创建多个子对象,ruby-on-rails,Ruby On Rails,为了学习,我正在开发一个简单的rails任务列表应用程序,我希望该应用程序能够在添加任务列表的同时创建一个新列表。我已经完成了创建列表的基本CRUD操作,现在我想添加在创建列表的同时创建任务的功能 我做了一些初步的联想,比如: <%= form_with scope: :list, url: lists_path, local: true do |form| %> <p> <%= form.label :title %><br>

为了学习,我正在开发一个简单的rails任务列表应用程序,我希望该应用程序能够在添加任务列表的同时创建一个新列表。我已经完成了创建列表的基本CRUD操作,现在我想添加在创建列表的同时创建任务的功能

我做了一些初步的联想,比如:

<%= form_with scope: :list, url: lists_path, local: true do |form| %>
  <p>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </p>
  <p>
    <%= form.label :public %><br>
    <%= form.check_box :public %>
  </p>
  <h2>Tasks</h2>
  <%= form.fields_for :tasks do |task_form| %>
    <p>
    <%= task_form.label :text %><br>
    <%= task_form.text_field :text %><br>
    </p>
  <% end %>
  <p>
    <%= form.submit %>
  </p>
<% end %>
我的列表模型:

class List < ApplicationRecord
  has_many :tasks
  accepts_nested_attributes_for :tasks
end
现在我的问题是如何为我的列表编写表单,并在其中添加动态数量的任务,然后将这些任务发送到我的
create
操作以保存它

我的
new
操作非常简单:

def new
  @list = List.new
end
我目前的表格如下:

<%= form_with scope: :list, url: lists_path, local: true do |form| %>
  <p>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </p>
  <p>
    <%= form.label :public %><br>
    <%= form.check_box :public %>
  </p>
  <h2>Tasks</h2>
  <%= form.fields_for :tasks do |task_form| %>
    <p>
    <%= task_form.label :text %><br>
    <%= task_form.text_field :text %><br>
    </p>
  <% end %>
  <p>
    <%= form.submit %>
  </p>
<% end %>




任务

我打算将其用于测试目的,首先创建一个包含一个任务的列表,然后创建一个包含两个任务的列表,最后创建一些代码,以便能够通过javascript添加新字段,以便创建无限数量的任务。然而,我遇到的问题是,当我提交此表单并在我的
create
操作中调用
params
时,我可以看到它包含我的任务:

参数

{\“utf8\”=>\“✓\", \"真实性令牌\“=>\”…\”、\“列表\“=>{\”标题\“=>”列表\“、\”公共\“=>”0\”、\”任务\“=>{\”文本\“=>”任务\“}、\”提交\“=>”保存列表\“、\”控制器\“=>”列表\“、\”操作\“=>”创建\“}”

但当我试图查看我的
列表参数中包含的内容时,我得到的忽略了任务:

列出参数

{\“title\”=>“list\”,\“public\”=>“0\”}

除此之外,如果我在我的任务表单中添加两个文本字段,比如用“task1”和“task2”填充,我在
params
中得到的只是“task2”,似乎覆盖了以前的任务

所以我的问题是

1) 我做的表格正确吗?我应该如何更改它以允许多个任务

2) 为什么我的
列表参数不返回任务中的任何数据

我想作为一种奖励,在保存一个列表的同时还能保存它的任务吗


编辑:如果有人想尝试,这里有我的项目的github链接:

也许这可以帮助你


看看这个gem:

我创建了一个新的rails应用程序,并尝试遵循您提供的代码

rails new a
rails generate scaffold List title public:boolean
rails generate scaffold Task text list:references
rails db:migrate
然后我编辑了和你一样的模型

app/models/list.rb

class List < ApplicationRecord
  has_many :tasks
  accepts_nested_attributes_for :tasks
end
我的列表参数方法是相同的

def list_params
  params.require(:list).permit(:title, :public, tasks_attributes: [:text])
end
对于我来说,通过以上所有步骤,应用程序可以正常工作,并将任务保存到相应的列表中。检查控制台是否显示类似“Unpermitted parameter::tasks\u attributes”的红色消息,如果是这样,则需要查看缺少的步骤

完成这项工作后,更改代码以显示更多任务字段很容易,只需在_form.html.erb中传递一个新任务数组,或在列表_controller.rb中创建更多构建即可

def new
  @list = List.new
  @list.tasks.build
end
第一种选择

<%= form.fields_for :tasks, [Task.new, Task.new] do |task_form| %>
   <p>
      <%= task_form.label :text %><br>
      <%= task_form.text_field :text %>
   </p>
<% end %>
def new
  @list = List.new
  2.times { @list.tasks.build }
end

祝你好运

这样做行不通。你能告诉我你的创建动作是什么样子的吗?我的不是创造。这是我的项目的github,如果你想试试的话:我没有改变创建方法,我只是让scaffold创建的方式。我查看了您的代码,发现您正在使用Rails 5.2.3。也许这就是为什么按照我的步骤对你不起作用。我强烈建议您首先更新Ruby和RubyonRails。您使用的是什么版本?Rails 5.2.3似乎是最新版本!我正在使用Ruby 2.6.3和Rails 6.0.0.rc1。尝试使用第三方工具(如rvm或rbenv)设置您的环境。
def list_params
  params.require(:list).permit(:title, :public, tasks_attributes: [:text])
end
<%= form.fields_for :tasks, [Task.new, Task.new] do |task_form| %>
   <p>
      <%= task_form.label :text %><br>
      <%= task_form.text_field :text %>
   </p>
<% end %>
def new
  @list = List.new
  2.times { @list.tasks.build }
end