рельсы не создают связь между динамически добавляемой вложенной формой и родительской

У меня есть форма «задачи», и я динамически добавляю дочернюю форму «шаги».

«Шаги» добавляются через вызов javascript для рендеринга («шаги/форма»).

Форма загружается нормально, но при отправке формы задач добавленный шаг не заносится в базу.

Я предполагаю, что это потому, что я не связываю две формы вместе, но я не совсем уверен.

Мой код Tasks/new.html.erb

<%= form_for @task, :html=>{:multipart=>true} do |f| %>
  <%= f.label :task_name %>
  <%= f.text_field :task_name %>
  
<%= link_to "Add Step", @step, :remote=>true, :class=>'addStep %>
<%= f.submit %>
<% end %>

<% content_for(:js) do %>
   $('a.addStep').click(function(){
      $('div#newStep').append("<%= escape_javascript(render('steps/form'))%>");
   });
<% end %>

шаги/_form.html.erb

<p class="fields">
   <%= fields_for :steps do |builder| %>
   <%= builder.label :title %>
   <%= builder.text_field :title %>
<% end %>

Я считаю, что проблема в том, что я не передаю «f» или «задачу» в форму «шаг», но я не мог понять, как это сделать.


person pedalpete    schedule 04.01.2011    source источник


Ответы (2)


Попробуйте что-то вроде этого:

<%= render :partial => 'steps/form',
             :locals => {:form => f} %>

Надеюсь это поможет.

Изменить-1

Сделайте следующее:

<%= form_for @task, :html=>{:multipart=>true} do |f| %>
  <%= f.label :task_name %>
  <%= f.text_field :task_name %>
  <div style="display:none;" id="steps_form">
       <%= render :partial => 'steps/form',
               :locals => {:form => f} %>
  </div>
<%= link_to "Add Step", @step, :onClick=>"js_function_to_change_display_property()", :class=>'addStep' %>
<%= f.submit %>
<% end %>

затем вы можете использовать простой javascript для просмотра формы шагов, изменив свойство display для steps_form.

person Harry Joy    schedule 04.01.2011
comment
Куда это приведет, Гарри? У меня нет тега частичного рендеринга, у меня есть только рендер('шаги/форма'). Не могли бы вы пояснить свой ответ? - person pedalpete; 04.01.2011
comment
Привет, Гарри, спасибо за редактирование вашего ответа, но ваш ответ на самом деле не решает проблему, поскольку в задачу может быть добавлено много шагов. Динамически добавляя форму шага, я могу добавить 3 шага к задаче, не покидая страницы. Я знаю, как скрыть/показать div. Я думаю, что вы на правильном пути с местными жителями, но мне не удалось заставить его работать в моем коде. - person pedalpete; 04.01.2011
comment
Я только что понял, что у меня есть jQuery.html вместо jQuery.append, поэтому форма не добавлялась несколько раз, но я отредактировал вопрос. - person pedalpete; 04.01.2011
comment
Нет, проблема не решена. Данные из шагов/формы не попадают в базу данных. - person pedalpete; 05.01.2011

Возможно, вам придется обновить параметры в родительском контроллере, чтобы включить атрибуты дочернего элемента. например

контроллеры/task_controller.rb

Class TasksController < ApplicationController
  ...

  def task_params
    params.require(:task).permit :name, :description ,
      steps_attributes: [:step, :step_description, :due_date]
  end
end

модели /task.rb

Class Task < ActiveRecord::Base
  has_many :steps
  accepts_nested_attributes_for :steps
end

модели /step.rb

Class Step < ActiveRecord::Base
  belongs_to :task
end
person Kat Russo    schedule 18.11.2016