21

link_to_functionRails 中 Javascript 助手的状态如何?我读到,包括在这个 stackoverflow question中,它在 Rails 3.0 中被弃用,然后被弃用,然后在 3.2.4 中再次被弃用。它是我可以依赖并教给学生的东西吗?我刚刚阅读了Rails 3.2.8 的发行说明(通过搜索)

恢复了 button_to_function 和 link_to_function 助手的弃用。拉斐尔·门东萨·弗朗萨

这现在在哪里?

4

3 回答 3

45

link_to_function在分支中不被弃用,将来也不会被弃用。但它在当前的master分支中已被弃用,并且在 Rails 4.0 发布时将被弃用。所以我猜它会在 4.1 中从 Rails 代码中删除。所以你可以教学生这样做(来自 rails 4 changelog):3-2-stable3-2-stable

我们建议使用 Unobtrusive JavaScript。例如:

link_to "Greeting", "#", class: "nav_link"

$(function() {
  $('.nav_link').click(function() {
    // Some complex code

    return false;
  });
});

或者

link_to "Greeting", '#', onclick: "alert('Hello world!'); return false", class: "nav_link"
于 2013-01-14T19:17:42.180 回答
4

这是我对这个问题的解决方案:

在 JavaScript 中:

// define function to be called
function awesome_func(a,b,c){
  console.log(a,b,c);
}

//clean implementation of link_to_function
$(function(){
  $('[data-on][data-call][data-args]').each(function(d){
    try{
       $(this).on( $(this).data('on'), function(){
          window[$(this).data('call')].apply(window,$(this).data('args'))})
    }catch(e){
       if(typeof(console) != 'undefined' && typeof(console.log === 'function'))
         console.log(e);
    }
  });
})

然后你可以在rails中做:

link_to 'Awesome Button', '#', data:{on: :click, call: 'awesome_func',args: '[1,"yeah",{b:4}]'

这似乎是他们希望我们编码的方式:),不过我喜欢 link_to_function

于 2015-05-17T11:32:16.893 回答
0

基于 Elias Baixas 的回答...如果这对任何人都有帮助,我必须对其进行一些更改才能使其正常工作...我必须添加eval并且preventDefault(我在 JS fwiw 上非常糟糕)

link_to fa_icon('info-circle'),
        '#',
        data: {
          on: :click,
          call: 'channel_info',
          args: Array('some data').to_json
        }


function channel_info(a){
  console.log(a)
}

//clean implementation of link_to_function
$(function(){
  $('[data-on][data-call][data-args]').each(function(d){
    try{
      $(this).on( $(this).data('on'), function(event){
        console.log($(this).data('args'));
        window[$(this).data('call')].apply(window,eval($(this).data('args')));
        event.preventDefault();
      })
    } catch(e) {
     if(typeof(console) != 'undefined' && typeof(console.log === 'function'))
       console.log(e);
    }
  });
})
于 2020-08-29T18:24:23.790 回答