Сортировка вложенных полей формы в рельсах - PullRequest
4 голосов
/ 01 марта 2012

Я пытаюсь создать форму инвентаризации, которая сортирует товары по категориям.В идеале я буду иметь возможность перечислять эти продукты по категориям и добавлю в него JavaScript, чтобы скрыть / показать продукты данной категории.

В настоящее время у меня возникают проблемы с тем, как разделить мои продукты по категориям в форме.Вот что у меня сейчас есть (смоделировано после Railscasts Райана Бейтса для вложенных атрибутов):

class InventoriesController < ApplicationController
 def new
  @title = "Take Inventory"
  @vendor = ProductVendor.find(params[:product_vendor_id])
  @inventory = Inventory.new()
  @products = @vendor.products.active
   @products.each do |product|
    @inventory_line_item = @inventory.inventory_line_items.build({:product_id =>    product.id})
   end
 end

Моя форма для нового инвентаря:

<%= form_for @inventory do |f| %>
 <table>
  <tr>
   <th>Item</th>
   <th>Quantity</th>
  </tr>

 <% f.fields_for :inventory_line_items do |builder| %>

 <tr>
  <td><%= builder.object.product.name %></td>
  <td><%= builder.text_field(:quantity, :size => 3) %></td>
      <%= builder.hidden_field :product_id %>
 </tr>

 <% end %>

 </table>
 <%= f.hidden_field(:user_id, :value => current_user.id) %>
 <%= f.hidden_field(:location_id, :value => current_location.id) %>
 <%= f.hidden_field(:product_vendor_id, :value => @vendor.id) %>

 <%= f.submit "Submit" %>

 <% end %>

Итак, у меня есть другая модель с именем product_category, котораяhas_many продукты.Как отсортировать и разделить мои продукты по категориям в контроллере и форме?Кроме того, есть ли способ сделать это с помощью Formtastic?Спасибо!

1 Ответ

6 голосов
/ 10 марта 2012

Это на самом деле довольно просто реализовать.Добавьте скрытое поле в поле nest_form с атрибутом position (конечно, добавьте этот атрибут к вашей модели) и добавьте его в свой js вместе с использованием jquery-ui.js

  $('#task_fields').sortable({
    items: '.fields',
    dropOnEmpty: true,
    cursor: 'move',
    handle: '.move',
    opacity: 0.4,
    scroll: true,
    axis:'y',
    placeholder: 'ui-state-highlight',
    start: function(e, ui) {
      ui.placeholder.height(ui.item.height());
    },
    update: function() {
      $(this).children(".fields").each(function(index) {
        $(this).children('input.task_position').val(index + 1);
      });
    }
  });  

вот чтоУ меня в _form.html.haml

= f.fields_for :tasks do |t|
  = t.text_field :name
  = t.hidden_field :position, :class => :task_position
  = t.collection_select :account_id, Account.all, :id, :full_name, :prompt => 'Assign task to...'
  .button-group
    %span{:class => "button icon no-text move pill"}
    = t.link_to_remove "", :class => "button icon no-text remove pill"
= f.link_to_add "Add a Task", :tasks, :class => "button icon add"

Это сработало очень хорошо.

...