Verschwurbelter Code

Sortierleiste

In meinem Rails-Programm möchte ich gerne Listenelemente (acts_as_list) horizontal sortieren können. Das ganze sollte über eine kleine Symbolleiste (s. Bild) über jedem Listenelement geschehen. Anfangs schrieb ich einfach den HTML/Rails-Code, der die 5 Buttons enthielt, direkt in den View hinein. Doch dann packte mich der Ehrgeiz und habe versucht, es zu verbessern. Am Ende hatte ich folgenden verschwurbelten Helpercode:

  def list_sort_buttons(options = {})
    "<table class=\"sort_buttons\"><tr>#{sort_buttons(options)}</tr></table>"
  end

  protected
  def sort_buttons(options = {})
    buttons = [ { :action => :to_top, :exclude_on => :first? },
                { :action => :up, :exclude_on => :first? },
                { :action => :delete, :exclude_on => :nil? },   # dummy
                { :action => :down, :exclude_on => :last? },
                { :action => :to_bottom, :exclude_on => :last? } ]
    cols = buttons.collect do |button|
      ["<td>", (sort_button(:controller => options[:controller],
                           :action => button[:action],
                           :id => options[:id]) unless options[:id].send(
                                                        button[:exclude_on])),
      "</td>"].join
    end.join
  end

  def sort_button(options = { :size => '16x16'})
    link_to image_tag(options[:action].to_s, :size => options[:size]),
            :controller => options[:controller], :action => options[:action],
            :id => options[:id]
  end

Endlich habe ich das Gefühl, die Anfängerpfade verlassen zu haben. Und das nur um DRY-willen.

An solchem Code sehe ich auch, daß es höchste Zeit fürs Wochenende wird

Tücken von acts_as_list

Beim benutzen von acts_as_list in Ruby on Rails bin ich beim entfernen von Listenelementen auf eine Hürde gestoßen. Nach dem Entfernen des Listenelementes wurden die nachfolgenden Elemente nicht korrekt sortiert. Ich weiß nicht, ob ich was da falsch verstanden habe oder ob es sich um einen Bug handelt. Um letztenendes ein korrektes Verhalten meiner Liste zu erhalten habe ich folgenden Code benutzt:

child.remove_from_list
child.position = nil
parent.children.delete(child)

Es erscheint mir ein wenig umständlich, aber es funktioniert.