2012-08-10 14 views
5

Próbuję utworzyć formularz, który pozwala mi przesłać nowe rekordy dla powiązania, w którym wejścia asocjacyjne są zgrupowane.grupowanie i fields_for

class Product < AR::Base 
    has_many :properties 
    accepts_nested_attributes_for :properties 
    end 

Należy zauważyć, że w sterowniku szereg właściwości są budowane dla produktu, tak @product.properties.empty? # => false.

Poniżej fields_for podaje mi prawidłowe dane wejściowe o nazwach takich jak product[properties_attributes][0][value].

= form.fields_for :properties do |pform|                                
    = pform.input :value 

Ale jak tylko spróbować i grupa stowarzyszenie już nie generuje wejścia z prawidłowymi nazwami:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name              
    = form.fields_for properties do |pform|                                
    = pform.input :value 

to utworzenie wejść którego atrybut jak product[product_property][value]name gdy w rzeczywistości należy product[property_attributes][0][value] jak w pierwszym przykładzie.

dokumentacja

szyn sugeruje, można to zrobić:

= form.fields_for :properties_attributes, properties do |pform| 

Ale to daje błąd „niezdefiniowanej wartości dla metody Array”.

Odpowiedz

6

trzeba skonfigurować tak:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name 
    = form.fields_for :properties, properties do |pform| 
    = pform.text_field :value 

To powinno działać w porządku, skoro masz accepts_nested_attributes_for :properties szyn wiedzieć, że to miało tworzyć pola dla properties_attributes. Co więcej, możesz dodać attr_accessible :properties_attributes, jeśli używasz jednego z najnowszych Railsów i jeśli jeszcze go nie dodałeś do swojego modelu;)

Ponadto, jeśli chcesz podjąć decyzję na podstawie jednej nieruchomości, możesz użyć następujący formularz, a także:

- @product.properties.group_by(&:group_name).each do |group_name, properties| 
    %h3= group_name 
    - properties.each do |property| 
    = form.fields_for :properties, property do |pform| 
     = pform.text_field :value 

Obaj są ładnie opisane tutaj: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for pod One-To-Many sekcja

+0

To wydaje się działać, nie wiem, dlaczego nie spróbować ': properties' zamiast ': property_attributes'. Przyjmę wkrótce. – Kris

1

Nie znam czystego rozwiązania "Rails" do tego typu rzeczy, ale często radzę sobie z tego typu sytuacjami bardziej ręcznie. np. - Przeprowadź pętlę przez grupy i warunkowo pokaż tylko te właściwości, które znajdują się w określonej grupie.

class Product < AR::Base 
    has_many :properties 
    accepts_nested_attributes_for :properties 

    def group_names 
    properties.map(&:group_name).uniq.sort 
    end 
end 

W widoku

- for group_name in product.group_names 
    = form.fields_for :properties do |pform| 
    %h3= group_name 
    - if pform.object.group_name.eql?(group_name) 
     = pform.input :value 

Nie może być trochę napowietrznych z tym, coraz listę właściwości produktu z wielokrotnie. Możesz zmodyfikować swoje połączenie has_many: properties, aby pobrać właściwości w porządku nazwa_grupy - wtedy możesz dodać% h3, gdy jest to nowa grupa.

- previous_group_name = nil 
= form.fields_for :properties do |pform| 
    - if pform.object.group_name != previous_group_name 
    %h3= pform.object.group_name 
    = pform.input :value 
    - previous_group_name = pform.object.group_name 

Kilka pomysłów dla Ciebie ...