Просто думаю о лучшем способе создания формы заказа, которая бы (с точки зрения пользователя):
- Разрешить добавление нескольких элементов.
- Каждый элемент имеет раскрывающийся список Имя, Тип работы и Загрузка файла.
- Пользователь может добавлять или удалять элементы.
- Пользователь должен предоставить хотя бы один товар.
- Все элементы должны быть проверены (например, требуются Имя, Тип задания и Файл).
- Когда он нажимает кнопку «Отправить», должен быть создан ордер со всеми элементами в нем.
Итак, модель выглядит так: User -1---*-Order-1---*- OrderItem-*--1-JobType
. Кроме того, OrderItem включает в себя ряд атрибутов, скажем, name
, file
.
Теперь я хотел бы иметь как можно более тонкий контроллер. Лучше со «стандартным» кодом, например:
class OrdersController < ApplicationController
def create
@order = Order.new(params[:order])
if @order.save
redirect_to account_url
else
flash.now[:error] = "Could not save Order"
render :action => "new"
end
end
end
Самым интересным является , как должен выглядеть вид, чтобы рельсы автоматически связывали все отправленные значения с правильными объектами ?
Пока я не беспокоюсь об ухудшении из JavaScript, а скорее о шаблоне для элементов, которые будут добавлены и связывающих все это с проверкой (вероятно, как частичной).
Я ожидаю, что шаблон будет похож на приведенный ниже, но не уверен.
<input type='text' name='order[order_items[name[]]][]' />
<select name='order[order_items[job_type[]]][]'>...</select>
<input type='file' name='order[order_items[file[]]][]' />
Мне нужно клонировать этот шаблон, чтобы добавить элемент с помощью JS.
Так что ответ должен:
- Включите представление или его часть, которая демонстрирует:
- правильная привязка почтовых значений;
- правильная проверка для всех элементов;
- Включить связанную часть модели.
- Включить изменения в контроллер ЕСЛИ и ТОЛЬКО ЕСЛИ необходимо.
- (JavaScript не требуется)
В идеале я хотел бы увидеть пример, если кто-то его знает (возможно, где-то на GitHub).
И последнее замечание, , пожалуйста , проверьте свои решения перед публикацией.
Спасибо
Дмитрий.