Question

What is the status of the link_to_function Javascript helper in Rails? I read, including in this stackoverflow question, that it was deprecated in Rails 3.0, then undeprecated, then deprecated again in 3.2.4. Is it something I can depend on and teach students? I just read the release notes (from a search) for Rails 3.2.8:

Reverted the deprecation of button_to_function and link_to_function helpers. Rafael Mendonça França

Where does this stand now?

Was it helpful?

Solution

link_to_function is NOT deprecated in 3-2-stable branch and it won't be deprecated in 3-2-stable in future. But it IS depreacated in current master branch and will be deprecated in Rails 4.0 when it releases. So I guess it will removed from rails code in 4.1. So you can teach students to do this (from the rails 4 changelog):

We recommend the use of Unobtrusive JavaScript instead. For example:

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

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

    return false;
  });
});

or

link_to "Greeting", '#', onclick: "alert('Hello world!'); return false", class: "nav_link"

OTHER TIPS

This is my solution to this problem:

in 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);
    }
  });
})

Then you can do in rails:

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

this seems the way they want us to code :), i liked link_to_function, though

Building on Elias Baixas answer... I had to change it a bit to get it to work if this helps anyone... I had to add eval and preventDefault (I'm pretty terrible at 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);
    }
  });
})
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top