RoR 3 Создание приложения Invoice - Как мне создать форму для ассоциации счетов-фактур HABTM / продуктов? - PullRequest
0 голосов
/ 21 октября 2011

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

ОБНОВЛЕНИЕ: информация о модели изменилась из-за недавних предложений

Invoice  
> id  
> created_at  
> sales_person_id

LineItem
> id  
> invoice_id  
> item_id  
> qty_commit (inventory only)  
> qty_sold  
> price (because prices change)  
> ...etc

Item
> barcode  
> name  
> price
> ...etc

Счет has_many items, :through => :line_items. То же самое для Item. Что я хочу сделать, так это то, что при создании нового счета-фактуры я бы хотел, чтобы форма заполнялась всеми доступными элементами. Единственный раз, когда я не хочу, чтобы все элементы были заполнены, это когда я просматриваю счет-фактуру (поэтому должны быть получены только те элементы, которые существуют в таблице LineItems) В настоящее время - и, очевидно, - новый Счет не имеет предметов. Как мне перечислить их, если в коллекции ничего нет, и как заполнить форму? Также я хотел бы, чтобы все продукты были доступны при сбое создания (наряду с тем, что пользователь выбрал через форму).

ОБНОВЛЕНИЕ: я могу создавать элементы через контроллер с помощью следующего:

@ invoice = Invoice.new
# Заполните счет со всеми продуктами, чтобы их можно было выбрать
Item.where ("stock>?", 0) .each do | i |
@ Invoice.items.new (i.attributes)
конец

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

Ожидается LineItem (# 37338684), получен массив (# 2250012)

Пример формы:

# f is form_for
<% @ invoice.items.group_by {| p | p.category} .each do | категория, продукты | %>

<% = category.name%>

<% = f.fields_for: line_items do | line_item | %>
<% для р в продуктах%>

<% = line_item.hidden_field: tax_included,: value => p.tax_included%>
<% = p.name%>
$ <% = p.price%>

<% end%>
<% end%>
<% end%>

1 Ответ

0 голосов
/ 21 октября 2011

Прежде всего, если вы явно хотите иметь модель соединения с дополнительными атрибутами, вы должны использовать has_many :through вместо has_and_belongs_to_many. См. RoR Руководство по различиям двух.

Во-вторых, нет единого решения для того, чего вы хотите достичь. Я вижу там два типичных использования, в зависимости от массы возможных случаев, одно лучше, чем другое:

  1. Используйте радиокнопки, чтобы выбрать (и отменить выбор), где должна быть создана или удалена связь. См. railscast # 165 , как это сделать.
  2. Вы можете использовать меню выбора с кнопкой, чтобы добавить отношение. См. railscast # 88 . Добавленное отношение может быть показано в списке, рядом с кнопкой удаления.
  3. Используйте поля токенов (см. railscast # 258 ) для автозаполнения нескольких записей в одном поле ввода текста.

Во всех ситуациях вам обычно нужно проверить в конце, если

  • отношение должно быть удалено
  • 1028 * хранится *
  • или создано

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


...