缺少Ruby on Rails数组中的元素

时间:2009-12-29 14:25:54

标签: ruby-on-rails ruby arrays

我对数组感到绝望。 我把一些数据放到一个数组中,但是当我迭代一些数组时 似乎错过了数组的元素,但缺少的元素是 显示在视图中。 我正在使用Plugin Rails_Authorization。 我的代码:

 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

我的调试日志:

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

2 个答案:

答案 0 :(得分:3)

尝试使用更简洁的#reject!语法,因为#delete调用听起来可能会导致问题。

 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.reject! do |task|
        !task.root? && current_user.has_roles_for?(Task.find(task.parent_id))
      end
    else #Wenn Subtasks angezeigt werden sollen
      @task=Task.find(params[:task_id])
      load_subtasks
      @tasks=@subtasks
    end
    # ...
  end

答案 1 :(得分:0)

你可能想尝试一下

@tasks.reject { |task| ... }

@tasks.delete_if { |task| ... }