Форма с динамическим количеством элементов - PullRequest
3 голосов
/ 05 марта 2010

Просто думаю о лучшем способе создания формы заказа, которая бы (с точки зрения пользователя):

  • Разрешить добавление нескольких элементов.
  • Каждый элемент имеет раскрывающийся список Имя, Тип работы и Загрузка файла.
  • Пользователь может добавлять или удалять элементы.
  • Пользователь должен предоставить хотя бы один товар.
  • Все элементы должны быть проверены (например, требуются Имя, Тип задания и Файл).
  • Когда он нажимает кнопку «Отправить», должен быть создан ордер со всеми элементами в нем.

Итак, модель выглядит так: 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).

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

Спасибо
Дмитрий.

1 Ответ

5 голосов
/ 05 марта 2010

Не отвечая на вопрос напрямую, но вот несколько источников, чтобы получить вас там:

О личной записке. Ваш вопрос наталкивается на просьбу, чтобы кто-то сделал вашу работу за вас. Я бы с удовольствием опубликовал ответ, чтобы покрыть все ваши потребности, если бы я был на часах.

...