Rails的link_to_function弃用状态?

时间:2013-01-14 19:08:48

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-4 link-to-function

Rails中link_to_function Javascript帮助程序的状态是什么?我读过,包括在this stackoverflow question中,它在Rails 3.0中被弃用,然后是不推荐的,然后在3.2.4中再次弃用。这是我可以依赖并教导学生的东西吗?我刚看了release notes (from a search) for Rails 3.2.8

  

恢复了对button_to_function和link_to_function助手的弃用。 RafaelMendonçaFrança

现在它在哪里?

3 个答案:

答案 0 :(得分:43)

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

  

我们建议您使用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"

答案 1 :(得分:2)

这是我解决这个问题的方法:

在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,尽管

答案 2 :(得分:0)

以Elias Baixas的答案为基础...如果对任何人有帮助,我都必须对其进行一些更改才能使其正常工作...我必须添加evalpreventDefault(我很漂亮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);
    }
  });
})