Jquery Sinatra(Ruby)-使用Ajax发布

Jquery Sinatra(Ruby)-使用Ajax发布,jquery,ruby,ajax,sinatra,sequel,Jquery,Ruby,Ajax,Sinatra,Sequel,我正在尝试使用$.post将一些数据实时提交到路线,目前我面临一个无法解决的神秘错误 这是我的路线 post "/share" do sid = params[:sid] user = (session[:level] == 1) ? params[:user] : session[:user] # Database require_relative "../../database/db.rb" db = DBShare.new db.sha

我正在尝试使用$.post将一些数据实时提交到路线,目前我面临一个无法解决的神秘错误

这是我的路线

post "/share" do
    sid   = params[:sid]
    user  = (session[:level] == 1) ? params[:user] : session[:user]
    # Database
    require_relative "../../database/db.rb"
    db = DBShare.new
    db.share(sid, user)
end
以下是我的$.post请求发送到路由时得到的结果

!! Unexpected error while processing request: undefined method `close' for 1:Fixnum
ajax调用在.fail()中返回,但数据库调用已完成(我使用Sequel来执行存储过程的数据库调用)——有趣的是,它在第一次调用时调用该过程两次,在后续调用时只调用一次

我想这可能是因为我的路由没有返回内容头-所以我在db调用后添加了“success”

这导致jquery返回.success()块,但数据库调用未完成

这是我的jQuery调用

// Share or unshare
$(document).on('click', '.share-unshare', function(event) {
    if (event.type == 'click') {
        var element     = $(this);
        var text        = $(this).text();
        var sid         = $(this).attr('sid');
        var r = '';

        // Unshared
        if (text == "Unshare") {
            r = confirm("Are you sure you want to unshare this?");
            if (r == false) {
                return false;
            }
            share(sid, element);

        // Shared
        } else {
            r = confirm("Are you sure?");
            if (r != false) {
                share(sid, element);
            }
        }

    }

    function share(sid, element) {
        var user = $('#details').attr('user');
        $.get('/share/', { 'sid' : sid, 'user': user })
            .success(function(data) {
               if (text == "Share") {
                   element.html("Unshare");
               } else {
                   element.html("Share");
               }
            })
            .fail(function() {
               alert("Something went wrong - unable to share / unshare");
            })
            .always();
    }

});
这里是DB调用(该过程可以正常工作,因此不涉及PL/SQL)

在这个阶段,我完全困惑了!有人知道它可能是什么吗

非常感谢

灰烬

更新:

我通过在db调用中绑定参数后添加ds.insert解决了此问题

def share(sid, user)
    sql = "
    BEGIN
        pa_share.pr_share_handle(?, ?);
    END;
    "
    ds = $db_app[sql, sid, user]
    **ds.insert**
end

返回到ajax调用的状态代码是什么?您要传递的值的类型是否正确?i、 e.
1
而不是
“1”
你好,伊恩-谢谢,我查过了。我设法解决了这个问题,在我的DB调用准备好之后,我将ds.insert添加到我的DB调用中。啊,我现在明白了。问题在于
share
的返回值,因为它要么返回续集数据集,要么仅返回
1
,以获得成功。我会在路由的末尾添加一点错误检查代码,然后向jquery调用者指示它是如何运行的。它使每个人(开发人员/Sinatra/jQuery)都更清楚该代码的意图和结果。很高兴你成功了!
def share(sid, user)
    sql = "
    BEGIN
        pa_share.pr_share_handle(?, ?);
    END;
    "
    ds = $db_app[sql, sid, user]
    **ds.insert**
end