我有一个Rails应用程序,试图从数据库中销毁多个条目。我试过了,
http://localhost:3000/users?ïds[]=1&ids[]=2
In my controller
def destroy
ids = params[:ids]
User.where(:id => ids).destroy_all
end
我得到这样一个错误,
ActionController::RoutingError (No route matches [DELETE] "/users"):
显示路由错误…如何解决这个问题……
delete users/:id{.:format} => destroy
路由为成员路由,即只有一个条目。
您需要为此创建一个收集路由和自定义操作。
#routes.rb
resources :users, :collection => {:delete_all => :delete}
#users_controller.rb
def delete_all
ids = get_ids_from_params
User.delete_all(["id in (?)", ids])
end
更好的解决方案是添加一个单独的路由。如果你想重用destroy操作,你可以使用这种方法(id必须是整数)
<<p> 视图/strong>删除单个用户
link_to(user_path(id), :method => :delete) # user/1
销毁多个用户
link_to(user_path(ids.join("-")), :method => :delete) # user/1-2-3
控制器def destroy
ids = params[:id].split("-")
User.where(:id => ids).destroy_all
end
现在你的destroy动作可以处理单个/多个id了
您给出的链接并没有说您可以将数组传递给默认的DELETE路由。它只说你可以在ActiveRecord对象的关系或数组上调用.delete_all
。
现在,这不起作用的原因是您只有resources :user
提供的默认路由。当然,这包括一条DELETE路由。它是DELETE /users/:id
。我不知道你是否可以传递一个数组作为:id
,但你当然不能传递任何东西作为:ids
,因为你试图这样做-这将不匹配的路由。
如果你真的需要一个操作来删除多个记录的id,你应该在你的路由文件中添加一个自定义路由。我认为请求的正确形式应该是users/destroy_all?ids[]=1&ids[]=2
,正如这里记录的那样,路由可能看起来像这样:
resources :users do
delete '/users/destroy_all/:ids' => 'users#destroy_all'
end
我还没有真正尝试过这个,它可能不起作用。