2009-12-04 162 views
0

我正在研究一個允許用戶選擇多個條目的應用程序。一旦選擇了這些條目,用戶可以選擇全部刪除它們。當點擊刪除按鈕(在選擇一個或多個條目後)時,會顯示一個模式對話窗口,顯示用戶用確認按鈕選擇的條目。在軌道中刪除多條記錄

目前,以上所有內容都是在客戶端上使用jQuery完成的。我已設法完成所有設置,以便確認按鈕(使用:method => :deletelink_to)的URL爲/entries/12,13,16,17,其中數字表示用戶所選條目的ID。我也試着發送格式爲/entries/[1,2,3,4]的網址,但沒有運氣。我有一種感覺,我不是發送真實陣列。

這裏是我的刪除方法,當使用一個ID,其工作完全正常(即/entries/1),並且將有希望繼續與一個ID的工作:

def destroy 
@entry = current_user.entries.find(params[:id]) 
@entry.destroy 

respond_to do |format| 
    format.html { redirect_to(entries_url) } 
    format.xml { head :ok } 
end 
end 

當我發送多個ID的(在格式1,2,3,4,5),只有第一個條目被刪除,而其餘條目保持不變。這裏是我的WEBrick日誌看起來像表演動作後:

Processing EntriesController#destroy (for 127.0.0.1 at 2009-12-03 23:07:24) [DELETE] 
    Parameters: {"action"=>"destroy", "_method"=>"delete", "id"=>"19,22", "controller"=>"entries"} 
    User Load (0.3ms) SELECT * FROM "users" WHERE ("users"."id" = '2') LIMIT 1 
    User Update (0.3ms) UPDATE "users" SET "updated_at" = '2009-12-04 04:07:24', "last_request_at" = '2009-12-04 04:07:24' WHERE "id" = 2 
    Entry Load (0.2ms) SELECT * FROM "entries" WHERE ("entries"."id" = 19 AND ("entries".user_id = 2)) 
    Tagging Load (0.4ms) SELECT * FROM "taggings" WHERE ("taggings".taggable_id = 19 AND "taggings".taggable_type = 'Entry' AND (taggings.context = 'tags')) 
    Tag Load (0.2ms) SELECT * FROM "tags" WHERE ("tags"."id" IN (22,23,24,29)) 
    Tagging Destroy (0.2ms) DELETE FROM "taggings" WHERE "id" = 66 
    Tagging Destroy (0.1ms) DELETE FROM "taggings" WHERE "id" = 67 
    Tagging Destroy (0.0ms) DELETE FROM "taggings" WHERE "id" = 68 
    Tagging Destroy (0.1ms) DELETE FROM "taggings" WHERE "id" = 69 
    Tagging Load (0.1ms) SELECT * FROM "taggings" WHERE ("taggings".taggable_id = 19 AND "taggings".taggable_type = 'Entry') 
    Entry Destroy (0.1ms) DELETE FROM "entries" WHERE "id" = 19 
    Entry Load (0.5ms) SELECT * FROM "entries" WHERE ("entries".user_id = 2) 
Redirected to http://localhost:3000/entries 

正如你所看到的,這些ID發送("id"=>"19,22"),但只有第一個項目被裝載。之後,其關聯的標記將被刪除(我正在使用acts_as_taggable_on插件)。然後,第一個條目(id => 19)被銷燬,用戶被重定向回到條目列表頁面。

應該做的是對每個傳遞的id重複該過程(重定向)。我很困惑,因爲RoRs docs狀態:

ID - 可以是一個整數或 整數數組。

我在做什麼錯?我覺得我好親近,我可以品嚐它!對我來說,獲得所有jQuery的工作是一個巨大的勝利,所以現在我知道控制器方法中處理多個id的唯一缺失。

任何幫助將不勝感激!

回答

0

您可以解析出params [:id]並從中創建一個數組,然後使用它。

0

快速修復:

我個人將發送ids不同的方式,但我不想弄糟你的路由。因此,這將工作,但我只能解決部分destroy

current_user.entries.destroy(params[:id].split(',')) 

這使得其作用範圍current_user而是直接與IDS的數組調用destroy功能。

更好的方式:

如何我可能會建議使它更明顯的是這樣的:

相反的/entries/12,13,16,17我會用/entries/multiple?del[]=12&del[]=13&del[]=16&del[]=17

我知道這是更長的時間,但它更符合軌道如何自然運作。然後,控制器上:

def destroy 
    id = params[:id] 
    id = (params[:del] || []) if(id == "multiple") 

    current_user.entries.destroy(id) 

    respond_to do |format| 
    format.html { redirect_to(entries_url) } 
    format.xml { head :ok } 
    end 
end 

現在你的功能支持正常的單destroy行動以及你的新的多destroy

+0

這打破了RESTful約定,應該放在另一個操作中。 – bensie 2009-12-04 05:01:36

3

有一個ActiveRecord方法來做你想要的 - 你可以看看destroy_all。它期望刪除一個字符串,數組或散列的id。

我常添加其他動作控制器爲destroy_multiple - 不要忘記添加回收路徑以及:

def destroy_multiple 
    current_user.entries.destroy_all(:id => params[:user_ids]) 
    redirect_to entries_url 
end 
+0

關於單獨操作的好處,但'destroy'會適合這裏的需求,因爲它接受單個ID或數組。 – 2009-12-04 05:13:41

+0

+1以獲得最佳答案。對不起,先挑選:) – 2009-12-04 05:24:11

-1

下面是一個朋友幫我想出了:

def destroy 
    params[:id].split(',').each do |id| 
     @entry = current_user.entries.find(id) 
     @entry.destroy 
    end 

    respond_to do |format| 
     format.html { redirect_to(entries_url) } 
     format.xml { head :ok } 
    end 
end 

我敢肯定,這可能會更好,更有效地完成,但對於Alpha來說,這會起作用。感謝大家的幫助!

+0

「效率低下」,因爲它爲每個'find'單獨調用數據庫,而不是一次完成它們。 – 2009-12-04 05:21:34

+0

我確實嘗試了上面的解決方案,而他們都沒有做到這一點。我真的非常感謝您爲幫助我而付出的時間和精力。我真的不想浪費任何人的時間。我確信上述解決方案將來會派上用場,但現在我需要快速開展工作。我希望你能理解並再次感謝。 – shaunandrews 2009-12-04 05:39:26

+0

@shaunandrews對於嘗試解決方案感到沮喪。我正在刪除我原來的評論,所以我可以感覺不到一個混蛋:) – 2009-12-04 05:59:09

0

您是否嘗試調試並檢查@entry中返回的內容。我想你可能沒有得到整個陣列。你可以嘗試使用ruby-debug插件來調試你的代碼。 請注意,使用GET進行刪除可能會產生not be the best選項