2009-05-05 11 views
6

Ho implementato alcune interessanti interfacce interattive che possono ordinare gli elenchi nella mia app per i modelli che utilizzano acts_as_list. Ho una funzione di ordinamento che viene chiamata e imposta la posizione per ogni record dopo ogni trascinamento utilizzando la funzione script.aculo.us di sortable_element.Come creare un'interfaccia ordinabile con "funge da set annidato" in RubyOnRails

Questo è un esempio di azione di controllo che gestisce l'ordine del drag and drop completa:

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

Ora sto cercando di fare la stessa cosa con un modello che è un insieme annidato (acts_as_nested_set) . Un esempio del tipo di interazione dell'interfaccia: http://script.aculo.us/playground/test/functional/sortable_tree_test.html

Sono bloccato su come scrivere l'azione del controller per gestire l'ordinamento al termine del trascinamento.

Ho aggiunto il: albero => true parametro alla funzione _element ordinabile finora che sembra inviare un elenco di hash ma sembra che mi mancano ancora informazioni circa l'intero ordine nidificato ....

Ero certo che questo è stato fatto prima e non volevo provare a reinventare la ruota, ma non riesco a trovare alcun esempio dell'azione del controller < -> vista con l'installazione della funzione js per gestire un ordinabile acts_as_nested_set

Qualsiasi aiuto con la creazione di un set annidato ordinabile interattivo in rubyonrails sarebbe apprezzato!

Grazie,

John

+0

Utilizzare l'impressionante plug-in nidificato nel caso in cui qualcuno sia interessato ad aiutare ... sostanzialmente estende l'originale nidificato _set – Streamline

+0

Ho bisogno esattamente della stessa cosa costruita con jQuery. Ho votato comunque. –

+0

Esistono modi integrati per abbinare l'ordine passato dall'hash params all'intero insieme annidato di tutti gli elementi nel modello? – Streamline

risposta

1

appena trovato questo:

sortable_element_for_nested_set su github

sembra che farà il lavoro, ma sto avendo alcuni bug durante il tentativo per implementarlo. Rende fondamentalmente il javascript restituisce l'id dell'elemento che è stato spostato, quindi passa attraverso gli elementi e restituisce i suoi nuovi valori parent, left e right. Non posso credere che ci sia voluto tanto tempo prima che qualcosa come questo fosse scritto! Fortunato è stato solo quando ne avevo bisogno :)

2

vedi esempio applicazione qui - http://github.com/matenia/jQuery-Awesome-Nested-Set-Drag-and-Drop

E 'un modo hacky di farlo, ma la sua sostanza, sorta prima, quindi salvare ordine. Utilizza nestedsortables, serializelist e 2 azioni per attraversare l'albero

PS: So che questa domanda ha più di un anno ma spero che il link sopra aiuti qualcun altro a venire qui.

modifica: aggiunto l'esempio Rails3 con un codice leggermente più pulito.

+0

Questo progetto non è stato aggiornato in 5 anni BTW. – fatfrog

2

una buona soluzione con ONE sql-query da 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

Penso che funzioni solo per gli elenchi, non per i set nidificati. D'altra parte, è una soluzione solo MySQL. – calas

1

Ecco un frammento di codice dal mio progetto che fa il trucco:

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 

Si chiama su il genitore, e ordinerà i bambini.

Basta passare il valore che si ottiene da ordinabili, in questo modo:

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

Spero che questo aiuti.

// Lars

0

the_sortable_tree

ordinabili nidificati Set per Rails 3.1+

Sognando Drag and Drop per i set nidificati? Dovrebbe essere con JQuery? Ecco la soluzione!