ciao a tutti =)
per gestire contenuti innestati (nel mio caso si tratta di pagine con
eventuali sotto-pagine), ho sfruttato il plugin acts_as_category.
con un po’ di codice javascript, ho inserito la possibilità di spostare
elementi di una lista per cambiare ordine e/o innestarli tra loro.
la richiesta generata dal javascript, ha una forma simile alla seguente:
{“pagelist”=>{“0”=>{“id”=>“2”, “children”=>{“0”=>{“id”=>“1”}}},
“1”=>{“id”=>“3”}, “2”=>{“id”=>“4”}}}
c’è una lista di items, ciascuno con un ‘id’ ed un eventuale ‘children’
che può contenere altri items.
il codice che ho scritto funziona, però sono perplesso perchè secondo me
potrebbe essere migliorato, ecco il metodo:
def update_page_order
def params_tree_parser(root, with_father=0, position = 0)
root.each do |child|
child.each do |subc|
if subc.is_a?(Hash)
if with_father > 0
Page.update(subc[“id”].to_i , :parent =>
Page.find(with_father), :position => (position += 1))
else
Page.update(subc[“id”].to_i, :parent => nil, :position =>
(position += 1))
end
if subc.has_key?(“children”)
params_tree_parser(subc[“children”], subc[“id”].to_i)
end
end
end
end
end
params_tree_parser(params[:pagelist]) if params[:pagelist]
render :nothing => true
end
è un metodo ricorsivo che chiama N volte questo comando:
Page.update(subc[“id”].to_i , :parent => Page.find(with_father),
:position => (position += 1))
un ordinamento potrebbe richiedere diverse query, è anche vero che sono
operazioni una-tantum fatte nella sezione admin, tuttavia mi piacerebbe
sapere da qualcuno più preparato, se c’è un modo migliore per ottenere
lo stesso risultato =P
grazie in anticipo,
A.