Вопрос по ruby-on-rails, ruby-on-rails-3, ruby-on-rails-3.2, ruby-on-rails-4, link-to-function – Состояние устаревания Rails 'link_to_function?

20

Каков статусlink_to_function Javascript помощник в Rails? Читаю, в том числе и вэтот вопрос, что это устарело в Rails 3.0, затем устарело, затем снова устарело в 3.2.4. Это то, от чего я могу зависеть и учить студентов? Я просто прочиталПримечания к выпуску (из поиска) для Rails 3.2.8:

Отменено устаревание помощников button_to_function и link_to_function. Рафаэль МендончФранса

Где это сейчас стоит?

Ваш Ответ

2   ответа
42

link_to_function являетсяНЕ устарел в3-2-stable ветвь и она победилане рекомендуется в3-2-stable в будущем. Но этоЯВЛЯЕТСЯ устарел в текущей основной ветке и будет устаревшим в Rails 4.0, когда он выйдет. Так что я думаю, он будет удален из кода рельсов в 4.1. Таким образом, вы можете научить студентов делать это (из журнала изменений 4):

Вместо этого мы рекомендуем использовать ненавязчивый 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"
Это перезагружает страницу после JavaScript. Добавление <код>удаленный: правда </ Код> останавливает обновление клиента, но все равно отправляет запрос на сервер. Есть ли способ остановить запрос все вместе? Hovo
Как бы выглядел этот рефакторинг, когда link_to_function используется в качестве помощника? Btuman
Я думаю, что у меня, увы, больше нет доступа к коду. в основном пришлось переделывать это с нуля. (Ухудшение этой вспомогательной функции сводило меня с ума) Btuman
@Btuman Вы нашли решение для этого? Я обновил Rails, и link_to_function устарела, и яЯ не уверен, как сделать ненавязчивый JS для этого. pwz2000
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);
    }
  });
})

Тогда вы можете сделать в рельсах:

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

это похоже на то, как они хотят, чтобы мы кодировали :), мне понравилась link_to_function, хотя

Отличное решение, должен быть (новый) принятый ответ ИМО. Обратите внимание, что первая функция может быть на странице, вторая функция должна быть вызвана после загрузки jquery, так что в макете, jpwynn
Тем не менее, вы должны знать о некоторых проблемах безопасности: если у вас есть какой-то тип wysiwyg (tinymce или fckeditor), вам нужно будет всегда удалять data-on, data-click и data-args для предоставленных пользователем элементов div. Elias Baixas

Похожие вопросы