3

我对 Sinatra 很陌生,正在制作一个简单的 todo 应用程序,它利用了基本的 CRUD 功能。

在后端,我有工作路线并测试了一切。我想合并一些前端功能,并决定使用 jQuery 来帮助解决这个问题。我在 jQuery 中有一段当前代码,当单击该项目时,它会将一个 css 类添加到其中一个待办事项中。我想包含一个按钮,上面写着“删除已完成的任务”,它将收集具有“已完成”类的任务,然后触发 Sinatra 路由,该路由将从数据库中删除任务。目前的西纳特拉路线是:

delete "/hub/note/:id" do
   n = Note.get params[:id]
   n.destroy
   redirect '/hub'
end

如何让 jQuery 和 Sinatra 将删除项目与“已完成”类进行通信。任何帮助都会非常有用。

4

2 回答 2

2

利用method_override技巧/黑客,您可以通过执行以下操作获得您想要的:

jQuery.post("/hub/note/" + id, {_method: "delete"}, callback);

任何利用Rack的东西,包括 Sinatra 和 Ruby on Rails,都应该有这种行为。

于 2012-04-22T18:35:54.127 回答
0

在您的 jQuery 代码中。

$.post('/user/' + user.id, {_method: 'delete'}, function(result_data) {
  console.log('DELETE result', result_data);
}).error(function(){
  console.log("Error trying to DELETE");
});

在您的 Sinatra 代码中

delete "/user/:id" do
  if request.xhr?
    content_type :json
    id = params[:id].to_i
    user = User.find_by_id(id)
    if !user
      status 404
      return {:success => false, :message => "Invalid ID supplied."}.to_json
    end
    user.destroy
    return {:success => true, :id => id, :message => "The User with ID #{id} was deleted."}.to_json
  end
  status 403
  return "<html><head><title>Error 403</title></head><body><h2>Expected an AJAX call.</h2></body></html>"
end

如果您的 sinatra 应用程序不是modular应用程序,那么还包括set :method_override, true与您的其他sets 的一行。

于 2012-11-28T03:43:45.817 回答