自定义路由不适用于setTimeout

时间:2015-11-02 17:27:39

标签: javascript ruby-on-rails-4

例如,我的routes.rb看起来像:

...
get 'abc/xyz' => 'abc#xyz', :as => 'abc_xyz'
...

的application.js:

...
$('a').click(showSpinner);
function showSpinner(evt) {
    link = $(this);
    evt.preventDefault();
    $('body').append('<div class="spinner-overlay"></div>');
    setTimeout(function() {
        window.location = link.attr('href');
    }, 10);
});
...

当使用该JavaScript的链接转到abc_xyz_path时,它会发出ActiveRecord RecordNotFound错误,因为它正在查找id为xyz而不是使用自定义路由的abc记录。但是,如果我删除了setTimeout,则没有问题,它可以工作。 Rails的路由系统是否存在超时问题?

更新

我意识到我不需要preventDefault()或setTimeout(),因为这个点击处理程序会在链接重定向之前发生。问题解决了。

2 个答案:

答案 0 :(得分:0)

您的链接在没有javascript的情况下工作的事实表明它指向了正确的URL。在javascript超时后Rails不知道或不关心请求,所以这不是问题。

所以,问题在于您的行:

window.location = link.attr('href');

必须设置错误的网址。你应该这样做:

console.log(link.attr('href'));

检查它的内容,并用它更新您的问题。我不知道link是什么,但根据您的代码示例,除了window.location = link.attr('href');

之外,它没有被提及

我要做的是:

window.location = $(this).attr('href');

$(this)会提到刚刚收到点击事件的想法,这就是你想要的。

答案 1 :(得分:0)

我意识到我不需要preventDefault()或setTimeout(),因为这个点击处理程序会在链接重定向之前发生。没有更多的问题。