2009-12-29 5 views
0

배열의 경우 절망합니다. 일부 데이터를 배열에 넣지 만 배열의 일부를 반복하면 배열의 일부 요소가 누락 된 것으로 보이지만 누락 된 요소는 이라는보기에 표시됩니다. 플러그인 Rails_Authorization을 사용하고 있습니다. 내 코드 :Ruby on Rails Array에 누락 된 요소

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 
     @[email protected] 
    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 

답변

3

#delete 호출이 문제가 발생할 가능성이 소리 때문에 더 간결 #reject! 구문을 사용하십시오.

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 
     @[email protected] 
    end 
    # ... 
    end 
0

당신은

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

또는

@tasks.delete_if { |task| ... } 
의 라인을 따라 뭔가를 시도 할 수도 있습니다