如何解决AngularJS删除Rails服务器Massif中VM对象的路由报错
解决Rails中DELETE /vms的路由错误及删除对象的正确方式
咱们先拆解你遇到的两个核心问题:路由配置的误区和HTTP请求的写法问题,一步步来搞定:
1. 修正Rails路由配置
你在routes.rb里写的:delete是不对的——Rails的RESTful路由体系中,删除单个资源对应的动作是destroy,不是delete。而且resources生成的销毁路由是针对单个资源的,路径是/vms/:id,而不是/vms(这个路径对应的是批量删除逻辑,默认resources不会自动生成)。
先把路由改成这样:
Rails.application.routes.draw do resources :vms, only: [:index, :create, :destroy], defaults: { format: 'json' } # 其他路由... end
改完后可以在终端跑rails routes命令,确认能看到这条正确的销毁路由:
DELETE /vms/:id(.:format) vms#destroy {:format=>"json"}
如果你想直接用name作为资源标识(而不是默认的id),可以给路由加param选项:
resources :vms, only: [:index, :create, :destroy], defaults: { format: 'json' }, param: :name
这样路由就会变成/vms/:name,刚好匹配你要删除的test这个名称。
2. 修正Angular的$http.delete请求写法
$http.delete的第二个参数不是直接传数据,而是一个配置对象。而且你需要把要删除的VM标识(id或name)放到URL路径里,或者作为查询参数传递。
情况1:用id作为标识(默认逻辑)
假设你的VM对象有id属性,请求应该写成:
// 假设第一个VM的id是1 $http.delete('localhost/vms/1') .then(function(response) { // 删除成功后的页面更新等处理 }) .catch(function(error) { // 错误提示等处理 });
情况2:用name作为标识(对应上面的自定义路由)
如果用name定位资源,直接把name放到URL里:
$http.delete('localhost/vms/test') .then(function(response) { // 删除成功后的处理 }) .catch(function(error) { // 错误处理 });
如果不想改路由,也可以把name作为查询参数传递,但需要在Rails控制器里额外处理:
$http.delete('localhost/vms', { params: { name: 'test' } })
对应的Rails控制器destroy方法要改成:
def destroy vm = Vm.find_by(name: params[:name]) vm.destroy if vm # 返回响应逻辑... end
3. 补充:Rails控制器的destroy方法示例
确保你的VmsController里有正确的销毁逻辑:
class VmsController < ApplicationController def index @vms = Vm.all render json: { success: true, vms: @vms } end def create # 你的创建逻辑... end def destroy # 用id的情况 # vm = Vm.find(params[:id]) # 用name的情况 vm = Vm.find_by(name: params[:name]) if vm&.destroy render json: { success: true }, status: :ok else render json: { success: false, error: 'VM不存在' }, status: :not_found end end end
这样调整后,你的删除请求就能正确匹配路由,成功删除指定的VM对象了。
内容的提问来源于stack exchange,提问作者Egor
相关产品推荐
相关产品推荐

