暂时禁用rails远程链接

时间:2014-06-08 03:45:22

标签: jquery ruby-on-rails

我有一个切换,我需要在服务器将真/假数据发送到数据库时禁用远程链接。然后,我将重新启用ajax:success上的链接。

我无法在rails远程链接上使用e.preventDefault()

我希望能够做到这样的事情:

$('body').on('click', '.toggle_link', function(){
  //disable remote link
})

$('body').on('ajax:success', '.toggle_link', function(){
  //enable remote link
})

有完成此操作的最佳做​​法吗?

5 个答案:

答案 0 :(得分:3)

这应禁用远程链接。

$('#remote_link').removeAttr('data-remote').removeAttr('href')

要重新启用它,您可以将目标网址存储在某个data属性(data-target或smth)中,并将href带回ajax:success

答案 1 :(得分:2)

最终为我工作的是使用user2675613的部分答案,然后删除了data-remote="true"data-method="put"属性。

//to disable
var url_link = $(this).attr('href');
$(this).attr('data-href', url_link);
$(this).attr('href', "#");
$(this).removeAttr('data-remote');
$(this).removeAttr('data-method');

//to enable 
var url_link = $(this).attr('data-href');
$(this).attr("href", url_link);
$(this).attr("data-remote", "true");
$(this).attr("data-method", "put");

这是一个更新操作,因此根据您的操作,您可以存储数据方法。

答案 2 :(得分:2)

您还可以连接到ujs中的ajax:beforeSend事件。

  $(document).on('ajax:beforeSend', 'a[data-remote=true]', function(event, xhr, status, error) {
    // stash the link
    // remove the href
  });

我使用了一个变量来防止数据远程链接在css类为'disabled'时运行

  $(document).on('ajax:beforeSend', 'a.disabled[data-remote=true]', function(event, xhr, status, error) {
    event.preventDefault();
    event.stopImmediatePropagation();
    return false;
  });

答案 3 :(得分:1)

要在点击时停用该链接,您可以write it's jquery in your asset pipeline。由于您无法使用e.preventDefault(),为什么不简单change it's href to #。使用data-href属性,该属性将包含您的原始链接,以便再次重新启用它(如果您有很多链接,并且不知道哪个链接将去哪里)。所以在你的jquery文件中你可以这样做:

$('body').on('click', '.toggle_link', function(){
  $(this).prop("href", "#");
});

再次重新启用它,您可以执行以下操作:

$('body').on('ajax:success', '.toggle_link', function(){
  var url = $(this).data("href");
  $(this).prop("href",url);
});

在rails js.erb文件中是ajax:success。因此,不是在js中编写整个ajax:成功代码,你可以在js.erb文件中编写它,但是你需要以某种方式将data-href的值发送给你的控制器(如果你还不知道url)的链接)。您可以按照以下步骤执行此操作:

一个。将routes.rb文件中的post网址设置为自定义操作。

湾在你的js文件中写下你的ajax调用:

$('body').on('click', '.toggle_link', function(){
  var url_link = $(this).data("href");
  $(this).prop("href","#");
  $.ajax({
    type: "POST",
    url: url_link,
    data: { data-url: url_link}
   });
});

℃。在自定义操作中,您可以按@url = params[:data-url]

获取该网址

d。在js.erb文件中,您可以简单地编写

$("#some_id_of_link").prop("href",@url);

答案 4 :(得分:1)

在添加disabled属性时,这用于禁用remote: truelink_to的行为。因此,您可以更清洁地处理这种情况。

$('a[data-remote]').on('ajax:beforeSend', function(event, xhr, settings) {
  if($(this).attr('disabled') == 'true' || $(this).attr('disabled') == 'disabled') {
    return false;
  }
});