missed elements in array

Hi,
i despair in case of an array.
I'll take some data into an array, but when i iterate the array some
elements of the array seems to be missed, but the missing element are
displayed in the view.
I'm using the Plugin Rails_Authorization.

my Code:

  def index
    if !params[:task_id] #Tasks der 1. ebene anzeigen, auf die der
User zugriff hat
      @tasks = current_user.is_owner_of_what +
current_user.is_moderator_of_what + current_user.is_user_of_what
      @tasks.uniq! #doppelte Einträge auf einen reduzieren
      puts @tasks
      @tasks.each do |task|
        puts task.id
        if !task.root? #ist Task kein wurzelelement?
          if (current_user.has_roles_for? Task.find(task.parent_id) )
#Hat der Benutzer Rechte auf Parent Task?
             @tasks.delete(task) #Objekt aus Array schmeißen da nur
die Elemente der 1. Ebene dargestellt werden sollen, auf die der
Benutzer Rechte hat

          end
        end
      end
    else #Wenn Subtasks angezeigt werden sollen
      @task=Task.find(params[:task_id])
      load_subtasks
      @tasks=@subtasks
    end
    #@tasks = Task.all
    respond_to do |format|

      format.html #index.html.erb
      format.xml { render :xml => @tasks }
    end
  end

And My Debugging Log:

#<Task:0x1036e6ca8>
#<Task:0x1036e3ee0>
#<Task:0x1036df958>
#<Task:0x1036dc190>
#<Task:0x1036d8ea0>
#<Task:0x1036d5138>
#<Task:0x1036d18f8>
#<Task:0x1036cbd90>
5
6
8
12
14

Hi,
i despair in case of an array.
I'll take some data into an array, but when i iterate the array some
elements of the array seems to be missed, but the missing element are
displayed in the view.
I'm using the Plugin Rails_Authorization.

You're deleting from the array as you are iterating over it - don't do
that.

Fred

Frederick Cheung wrote:

Yep. A common mistake when iterating arrays. One solution is to build a
new array containing the objects you want, rather than deleting objects
that you don't want. There may be better approaches that might use less
memory though.

And if you do want to do that, a rubyish way of doing that is to use
methods like select

The relevant portion of the code above could be written as

@tasks = @tasks.select {|task| task.root? || !
current_user.has_roles_for?(Task.find(task.parent_id))}

(probably a little faster too - Array#delete is O(n))

Fred