删除Rails中的多个记录

时间:2009-12-04 04:32:28

标签: jquery ruby-on-rails arrays

我正在开发一个允许用户选择多个条目的应用程序。选择这些条目后,用户可以选择全部删除它们。单击删除按钮(选择一个或多个条目后),将显示一个模态对话框窗口,显示用户使用确认按钮选择的条目。

目前,以上所有内容都是在客户端使用jQuery完成的。我已设法将其设置为全部,以便确认按钮(使用link_to的{​​{1}})的网址为:method => :delete,其中数字代表条目的ID用户选中。我也试过发送格式为/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 )时,只删除第一个条目,而其余条目保持不变。以下是执行操作后我的webrick日志的样子:

1,2,3,4,5

如您所见,发送了ids(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"=>"19,22"插件)。然后,销毁第一个条目(acts_as_taggable_on),并将用户重定向回条目列表页面。

应该做的是为每个传递的id重复该过程(重定向)。我很困惑,因为RoRs docs表示:

  

id - 可以是整数也可以是   整数数组。

我做错了什么?我觉得我很亲密,我可以品尝它!让我所有的jQuery工作是一个巨大的胜利,所以现在我知道处理多个id的控制器方法中唯一缺少的部分。

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:3)

有一个ActiveRecord方法可以完全按照你想要的方式完成 - 查看destroy_all。它希望删除一个字符串,数组或者哈希值。

我经常向控制器添加另一个动作destroy_multiple - 不要忘记添加收集路线:

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

答案 1 :(得分:0)

你可以解析params [:id]并从中创建一个数组,然后使用它。

答案 2 :(得分:0)

快速修复:

我个人会以不同的方式发送ids,但我不想搞砸你的路由。所以这会有效,但我只讨论destroy部分:

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

这使其范围限定为current_user,但直接使用id数组调用destroy函数。

更好的方式:

我怎么建议让它更明显是这样的:

而不是/entries/12,13,16,17我会使用/entries/multiple?del[]=12&del[]=13&del[]=16&del[]=17

我知道它更长,但它更符合rails如何自然地工作。然后在控制器上:

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

答案 3 :(得分:0)

您是否尝试调试并检查@entry中返回的内容。我想你可能没有得到整个阵列。您可以尝试使用ruby-debug插件来调试代码。 另外,使用GET删除可能是not be the best选项

答案 4 :(得分:-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

我确信这一切都可以做得更好,效率更高,但对于阿尔法来说,这一切都会奏效。感谢大家的帮助!