accepts_nested_attributes без сохранения каких-либо изменений - PullRequest
0 голосов
/ 08 декабря 2010

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

Мои приборы создают правильные отношения между line_items и счетами, и все отображается правильно в моих представлениях, но я не могу получитьлюбые записи line_item для правильного сохранения (в моей консоли Rails или в моих представлениях).

class Invoice < ActiveRecord::Base
  attr_accessible :line_items  #and the rest of my relevant attributes
  has_many :line_items, :dependent => :destroy
  accepts_nested_attributes_for :line_items, :allow_destroy => true
  # Rest of my model code
end

class LineItem < ActiveRecord::Base
  attr_accessible :invoice_id  #and the rest of my relevant attributes
  belongs_to :invoice  
end

Для моих счетов существует метод line_items_attributes=, но он не сохраняет строки line_items для новых счетов.Еще более раздражающим является то, что я могу редактировать существующие line_items или назначать их по факту, но не одним махом (весь смысл вложенных атрибутов?).Мои представления не могут даже редактировать существующие line_items через форму счета.Есть идеи?Рад опубликовать больше кода, но не ради краткости.

Заранее спасибо ...

КОД ПРОСМОТРА (по запросу):

(Частичная форма дляСчета-фактуры)

<%= form_for(@invoice) do |f| %>
  <% @invoice.line_items.build unless @invoice.line_items.any? %>
  ...
  <% f.fields_for :line_items do |builder| %>
    <%= render 'line_item_fields', :f => builder %>
  <% end %>

(Частичная форма для позиций)

...
<%= f.collection_select :sku_id, @skus, :id, :name, :prompt => true %>
<%= f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)") %>

(JavaScript)

function remove_fields(link) {
  $(link).previous("input[type=hidden]").value = "1";
  $(link).up(".fields").hide();
}

Ответы [ 2 ]

3 голосов
/ 08 декабря 2010

Вероятный виновник здесь - attr_accessible. Когда вы используете acceptpts_nested_attributes_for, имя атрибута для ассоциации - association_attributes. Итак, вы хотите

attr_accessible :line_items_attributes

вместо

attr_accessible :line_items
0 голосов
/ 08 декабря 2010

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

http://kconrails.com/2010/10/19/common-addresses-using-polymorphism-and-nested-attributes-in-rails/

Следование этому руководству может решить вашу проблему.

...