2013-11-04 46 views
3

我目前正在努力解决如何删除使用Angular JS和Sinatra的记录。目前该代码会引发内部500服务器错误。我在网上浏览了如何正确执行此操作的教程,但找不到任何相关的内容。角JS删除方法Sinatra

我的代码如下所示:

app.rb

#Delete download 
#not working... 
delete '/view1/downloaddelete' do 
ng_params = JSON.parse(request.body.read) 
@download = Download.get(ng_params) 

if @download.destroy 
    {:success => "ok"}.to_json 
    #log to console if download delete is successful 
    puts "download delete successful" 
else 
    halt 500 
    #log to console if download delete is unsuccessful 
    puts "download delete unsuccessful halt 500" 
end 
end 

downloads.html

<p>Manage downloads</p> 
<ul> 
    <li ng-repeat="item in items">Title: {{item.title}}, ID: {{item.downloadID}}<a ng-controller="MyCtrl3" ng-click="deletedownload({{item.downloadID}})">Delete</a></li> 
</ul> 

controllers.js

//not working... 
app.controller('MyCtrl3', ['$scope', '$http', function ($scope, $http) { 
$scope.downloaddeleteid = {}; 
$scope.deletedownload = function() { 
    $http({ 
     method : 'DELETE', 
     url : '/view1/downloaddelete', 
     data : $scope.downloaddeleteid 
    }); 
} 
console.log($scope.deletedownload); 
}]); 

任何帮助将是非常请欣赏。

回答

2

你不需要第二个控制器来做到这一点(MyCtrl3)。

更改链接:

<a ng-click="deletedownload(item.downloadID)">Delete</a> 

这个功能添加到$范围,这种观点结合(即有“项目”列表中的$范围):

$scope.deletedownload = function(downloadID) { 
    $http({ 
     method : 'DELETE', 
     url : '/view1/downloaddelete', 
     data : downloadID 
    }); 
} 

小教程:
您的视图与您从控制器代码操作的特定$范围相关联。在那里,您可以定义您的“项目”列表和“已下载”功能。对于列表中的每个项目,ng-repeat创建一个新的$作用域,它从父级$ scope(前面提到的那个)原型继承它的所有属性,并且定义了一个名为“item”的新属性,它是列表中的一个项目当时。

当你写:

ng-click="deletedownload(item.downloadID)" 

你本质上定义了一种评估其对相关$范围“表达”的。这意味着您可以引用的变量(词法作用域)必须是锚DOM元素所关联的$ scope的属性。由于anchor元素是列表项元素的子元素,因此它与在此处创建的$范围相关联。这个$ scope有一个从它的父$ scope继承的“deletedownload”成员和一个由ng-repeat创建的“item”成员。

我建议你使用Firefox和Firebug + AngScope(我写的一个小扩展)来检查DOM元素后面的$ scopes。您还应该验证对您后端的HTTP调用是否包含正确的数据。

+0

非常感谢!非常丰富的答案:)我也必须修改我的ruby方法,请参阅编辑! –