2009-05-05 6 views
6

Wdrożyłem kilka ciekawych interaktywnych interfejsów, które mogą sortować listy w mojej aplikacji m rails dla modeli, które używają acts_as_list. Mam funkcję sortowania, która jest wywoływana i ustawia pozycję dla każdego rekordu po każdym przeciągnięciu i upuszczeniu za pomocą funkcji scriptable.aculo.us sortable_element.Jak utworzyć sortowalny interfejs z "działa jak zestaw zagnieżdżony" w RubyOnRails

To jest przykład działania kontrolera, który obsługuje ten rodzaj po przeciągnij i upuść uzupełnia:

def sort 
    params[:documents].each_with_index do |id, index| 
     Document.update_all(['position=?', index+1], ['id=?', id]) 
    end 
    end 

Teraz staram się zrobić to samo z modelem, który jest zagnieżdżony zestaw (acts_as_nested_set) . Przykładowy rodzaj interakcji interfejsu: http://script.aculo.us/playground/test/functional/sortable_tree_test.html

Utknąłem, jak napisać działanie kontrolera, aby obsłużyć sortowanie po zakończeniu przeciągania i upuszczania.

Dodałem: Tree => true parametr do funkcji _element sortable dotychczas która wydaje się wysłać listę skrótów, ale wydaje się, że ja wciąż brakuje informacji o całej zagnieżdżonego porządku ....

Byłem pewien, że zostało to zrobione wcześniej i nie chciałem próbować odkrywać koła, ale nie mogę znaleźć żadnych przykładów działania kontrolera < -> widok z ustawieniem funkcji js do obsługi sortowalnego acts_as_nested_set

Każda pomoc przy tworzeniu interaktywnego, sortowalnego zestawu zagnieżdżonego w rubyonrailach byłaby doceniona!

Dzięki,

John

+0

Korzystanie z niesamowitej wtyczki zestawu zagnieżdżonego na wypadek, gdyby ktoś chciał pomóc ... w zasadzie rozszerza pierwotnie zagnieżdżony zestaw – Streamline

+0

Potrzebuję dokładnie tej samej rzeczy zbudowanej z jQuery. I tak głosowałem. –

+0

Czy istnieją wbudowane sposoby dopasowania kolejności przekazanej z paramela skrótu do całego zestawu zagnieżdżonych wszystkich elementów w modelu? – Streamline

Odpowiedz

1

Wystarczy znaleźć to:

sortable_element_for_nested_set na github

Wygląda na to, że wykona pracę, jednak mam pewne błędy podczas próby do wdrożenia. Zasadniczo sprawia, że ​​javascript zwraca id elementu, który został przeniesiony, następnie przechodzi przez elementy i zwraca jego nowe wartości rodzica, lewej i prawej. Nie mogę uwierzyć, że tak długo trwało pisanie czegoś takiego! Na szczęście było to tylko kiedy to potrzebne :)

2

zobaczyć przykładową aplikację tutaj - http://github.com/matenia/jQuery-Awesome-Nested-Set-Drag-and-Drop

Jest to hacky sposób to zrobić, ale jest w zasadzie, sortowanie, potem zapisać zamówienia. Używa nestedsortables, serializelist i 2 akcji do przemierzania drzewa

PS: Wiem, że to pytanie ma ponad rok, ale mam nadzieję, że powyższy link pomoże komuś innemu przybyć tutaj.

edytuj: dodano przykład Rails3 z nieco czystszym kodem.

+0

Ten projekt nie był aktualizowany przez 5 lat BTW. – fatfrog

2

dobrym rozwiązaniem z JEDNYM zapytania SQL z http://henrik.nyh.se/2008/11/rails-jquery-sortables

# in your model: 

def self.order(ids) 
    update_all(
    ['ordinal = FIND_IN_SET(id, ?)', ids.join(',')], 
    { :id => ids } 
) 
end 
+0

Myślę, że to działa tylko dla list, a nie zestawów zagnieżdżonych. Z drugiej strony jest to rozwiązanie wyłącznie MySQL. – calas

1

Oto fragment kodu z mojego projektu, który załatwia sprawę:

http://gist.github.com/659532

def reorder_children(ordered_ids) 
    ordered_ids = ordered_ids.map(&:to_i) 
    current_ids = children.map(&:id) 
    unless current_ids - ordered_ids == [] && ordered_ids - current_ids == [] 
     raise ArgumentError, "Not ordering the same ids that I have as children. My children: #{current_ids.join(", ")}. Your list: #{ordered_ids.join(", ")}. Difference: #{(current_ids - ordered_ids).join(', ')}/#{(ordered_ids - current_ids).join(', ')}" 
    end 
    j = 0 
    transaction do 
     for new_id in ordered_ids 
     old_id = current_ids[j] 
     if new_id == old_id 
      j += 1 
     else 
      Category.find(new_id).move_to_left_of(old_id) 
      current_ids.delete(new_id) 
     end 
     end 
    end 
    end 

to nazwać na rodzicem, a to uporządkuje dzieci.

po prostu przekazać wartości, które można uzyskać z oczyszczenia nasion, tak jak poniżej:

def reorder 
    @category.reorder_children(params[:categories]) 
    render :nothing => true 
    end 

nadzieję, że to pomaga.

// Lars

0

the_sortable_tree

Sortable Zagnieżdżony Set dla Rails 3.1 i nowsze

marzy o przeciągnij i upuść dla zagnieżdżonych zestawów? To powinno być z JQuery? Oto rozwiązanie!

Powiązane problemy