Создание нескольких детей одновременно с созданием родителя - PullRequest
0 голосов
/ 12 июля 2019

Я работаю над простым приложением списка задач rails для учебных целей, и одна из вещей, которые я хотел бы иметь в приложении, - это возможность создавать новый список в то же время, как я могу добавить взадачи в этом списке.Я завершил основные действия CRUD для создания списков, и теперь я хочу добавить возможность создания задач одновременно с созданием списков.

Я сделал некоторые из первоначальных ассоциаций, например так:

Модель "Мой список":

class List < ApplicationRecord
  has_many :tasks
  accepts_nested_attributes_for :tasks
end

Модель "Моя задача":

class Task < ApplicationRecord
  belongs_to :list
end

Кроме того, я изменил свой list_params, чтобы также вернуть задачи:

def list_params
  params.require(:list).permit(:title, :public, task_attributes: [:text])
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, чтобы я мог создавать неопределенное количество задач.Однако проблема, к которой я пришел, заключается в том, что когда я отправляю эту форму и вызываю params в моем действии create, я вижу, что она содержит мою задачу:

params

{\"utf8\"=>\"✓\", \"authenticity_token\"=>\"...\", \"list\"=>{\"title\"=>\"list\", \"public\"=>\"0\", \"tasks\"=>{\"text\"=>\"task\"}}, \"commit\"=>\"Save List\", \"controller\"=>\"lists\", \"action\"=>\"create\"}"

Но когда я пытаюсь увидеть, что содержится в моем list_params, то, что я получаю, пропускает задачи:

list_params

{\"title\"=>\"list\", \"public\"=>\"0\"}"

И, кроме того, если я добавлю два текстовых поля в форму задач, скажем, заполненных "task1" и "task2", то, что я получу в params is only "task2", казалось бы, перезаписывая предыдущее задание.

Итак, мои проблемы

1) Я правильно делаю свою форму?Как мне изменить его, чтобы он позволял выполнять несколько задач?

2) Почему мой list_params не возвращает никаких данных из задачи?

и я думаю, что в качестве бонуса мне не хватает чего-то еще, чтобы я мог сохранить список одновременно с его задачами?

РЕДАКТИРОВАТЬ: Вот ссылка на github для моегопроект, если кто-то хочет попробовать это: https://github.com/bpromas/task-list

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Может быть, это может вам помочь.

Посмотрите на этот камень: https://github.com/nathanvda/cocoon

0 голосов
/ 12 июля 2019

Я создал новое приложение 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

app / models / task.rb

class Task < ApplicationRecord
  belongs_to :list
end

Теперь я посмотрел ваш код и не понял, как вы инициализировали задачи, которые будут отображаться в form.fields_for.Я собираюсь напечатать две известные мне возможности.

Первая возможность - создание нового экземпляра Task в _form.html.erb

<%= form.fields_for :tasks, Task.new do |task_form| %>
   <p>
      <%= task_form.label :text %><br>
      <%= task_form.text_field :text %>
   </p>
<% end %>

Вторая возможность - создание новых экземпляров Task.в lists_controller.rb

def new
  @list = List.new
  @list.tasks.build
end

Мой метод list_params такой же

def list_params
  params.require(:list).permit(:title, :public, tasks_attributes: [:text])
end

Для меня со всеми вышеперечисленными шагами приложение работает правильно, сохраняя задачи для соответствующего списка.Проверьте, отображает ли консоль красное сообщение типа «Unpermitted параметр:: tasks_attributes», если есть, то есть какой-то пропущенный шаг, на который вам нужно обратить внимание.

Время, когда вы выполняете эту работу, чтобы изменить кодпросто отобразить больше полей задачи, просто передайте массив новой задачи в _form.html.erb или создайте дополнительные сборки в lists_controller.rb

Первая альтернатива

<%= 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

Удачи !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...