2012-05-11 8 views
5

Używam Ryan Bates nested_form gem. Chciałbym mieć możliwość kontrolowania kolejności, w której lista zawiera zagnieżdżone pola. Mam default_scope, który działa, ale potrzebuję większej kontroli nad tym w zależności od scenariusza.Rails nested_form ordering

Idealnie coś

# In controller action 
@nesties = Nesty.order("name desc") 

# In view 
# If @nesties defined the following line would respect the @nesties ordering 
f.fields_for :nesties do |nestie-form| 

Teraz będzie respektować kolejność default_scope, ale nie mogę znaleźć żadnego innego sposobu, aby kontrolować kolejność.

Odpowiedz

7

W modelu, który ma związek nesties:

has_many :nesties, :order => "name DESC" 

To może być zbyt globalne dla aplikacji choć.

Ale podstawową rzeczą jest to, że fields_for nie odbiera @nesties, które pobiera na skojarzenie modelu formularza nadrzędnego.

EDIT: Nie wiem, to będzie działać z nested_form gem ale to rozwiązanie nie wpłynie na normalne zamawianie stowarzyszenia nesties:

named_scope :ordered_nesties, :order => "name DESC" 

następnie

f.fields_for :ordered_nesties do |nestie-form| 
+1

Nie mogłem zmusić scope/named_scope do pracy jako symbolu do f.fields_for, ale: kolejność na skojarzeniu działa. Niestety nie oferuje on dużo więcej kontroli niż po prostu używanie default_scope, ale dzięki za informacje. – jfeust

12

Zauważ, że fields_for akceptuje drugi argument, i to jest, gdzie nazwany zakres może być określony podczas określania obiektów/powiązań do użycia. Poniższe pracował dla mnie. Szyny 3.x

#In Model Nestie 
scope :ordered_nesties, order("name DESC") 
belongs_to :parent 

#In Model Parent 
has_many :nesties 

#In View 
f.fields_for :nesties, @parent.nesties.ordered_nesties do |nestie-form| 

Mam nadzieję, że to pomoże.

+3

To prawdopodobnie powinna być akceptowana odpowiedź :) – imderek

+0

Zobacz ['Ciało zakresu musi być możliwe do wysłania'] (http://stackoverflow.com/questions/28951671/argument-error-the-scope-body-needs-to-be -poprawny) i po tej korekcie składni, to rozwiązanie zadziałało doskonale dla mnie. – AOphagen

0

Klej nested_form wydaje się mieć dziwne zachowanie (jest to według mnie błąd). Po nadaniu kolekcji do renderowania - sortuje ją według "id" przed renderowaniem. Może być przezroczysty dla większości osób, ale w niektórych sytuacjach jest nieprzyjemny.

Rozwiązanie podane powyżej przez Shantanu rozwiązuje ten problem, bezpośrednio dostarczając kolekcję do pola_dla renderowania i skutecznie ominięciem iteratora nested_forms.

Zmarnowałem ponad 2 godziny, próbując rozwiązać ten problem ... Dzięki Shantanu!

1

FYI, to coś dla mnie pracował bez zakres

f.fields_for :nesties, @parent.nesties.ordered("name DESC") do |nestie-form| 
1

udało mi się dostać moje zagnieżdżone obiekty tworzą uporządkowane stosując następującą metodę. Mamy nadzieję, że pomoże to komuś innemu ...

<%= form.nested_fields_for :evaluations, 
     form.object.evaluations.target.sort_by! { |e| e.skill.sort } do |f| %>