Вложенный атрибут не сохраняется в форме с полиморфными ассоциациями - PullRequest
2 голосов
/ 12 июля 2011

Я пытаюсь создать приложение, в котором пользователь может сохранять цели, вехи для этих целей, задачи для вех и задачи для самой цели. Я использую полиморфные ассоциации, но создание формы для ввода их всех оказалось трудным. Проблема заключается в том, что вехи вообще не сохраняются, а задачи вехи перечислены в базе данных как имеющие тип «Цель» вместо типа «Веха». Модели и база данных настроены как , верхний ответ для этот вопрос . Я надеюсь, что кто-то может взглянуть на мою реализацию form_for и посмотреть, правильно ли это, или проблема в другом месте. Дайте мне знать, если вам нужен какой-то другой код.

<%= nested_form_for @goal do |f| %>

  <%= render 'shared/error_messages', :object => f.object %>
  <%= render 'shared/goal_fields', :f => f %>

  <%= f.fields_for :milestones do |ff| %>
    <%= render 'shared/milestone_fields', :f => ff %>
  <% end %>  

  <%= f.fields_for :tasks do |ff| %>
    <%= render 'shared/task_fields', :f => ff %>
  <% end %>

  <%= f.link_to_add "Add Milestone", :milestones %>
  <%= f.link_to_add "Add Task", :tasks %>
  <%= f.submit %>

<% end %>

1 Ответ

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

Метод построителя форм Rails fields_for позволяет вкладывать атрибуты для нескольких записей.Эта часть вашего кода выглядит правильно (при условии, что ваши партиалы работают).Вы можете сделать вашу строку fields_for более явной, построив связь с целевым объектом следующим образом:

<%= f.fields_for :milestones, @goal.milestones.build do |ff| %>
  <%= render 'shared/milestone_fields', :f => ff %>
<% end %>

Убедитесь, что ваши модели имеют следующий код для обработки параметров, которые будут переданы каждому изэти модели:

# app/models/goal.rb
 has_many :milestones
 has_many :tasks
 accepts_nested_attributes_for :milestones
 accepts_nested_attributes_for :tasks

# app/models/milestone.rb
 has_many :tasks
 accepts_nested_attributes_for :tasks # For tasks on milestones

Также убедитесь, что если вы используете attr_accessible для блокировки атрибутов вашей модели из массового назначения, эти записи имеют соответствующие записи (milestones_attributes, tasks_attributes и т. д.)

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

{: goal => {: milestones_attributes => {: tasks_attributes => {},: tasks_attributes => {}}}

Если все эти данные обрабатываются, но запись все еще не сохраняется, проверьте в журнале записи «ROLLBACK», которые могут указывать, что запись не являетсядопустимый и не может быть вставлен.

Более подробную информацию о nested_attributes можно найти здесь: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Информацию о помощниках формы, использующих эти вложенные атрибуты, можно найти здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

...