Сложная замена ERB на HAML не работает в JS

Я заменил свои файлы ERB на HAML, которые отлично работают. Однако у меня есть сложный смешанный код javascript и erb, который не работает при преобразовании в haml. Я знаю об опции ":plain" для обхода haml, но когда я делаю это с кодом ниже, код erb просто печатается как текст, но не интерпретируется. У вас есть какое-нибудь решение?

Замена ERB на HAML не работает в JS

  - if (@active == "tasks")
    :plain
      $('#content_output').html("<div class='content_title task'></div><h3><%= I18n.t :task_all %></h3><%= escape_javascript(render('tasks/all_tasks', :tasks => @contact_tasks, :layout => 'normal')) %></div>");
      $('#content_input').html("<div class='content_title task'></div><h3><%= I18n.t :task_new_title %></h3><%= escape_javascript(render('tasks/new_task')) %></div>");
      $('a#tasks_tab').addClass('active');

Это исходный код js.erb:

    <% if (@active == "tasks") %>
        $('#content_output').html("<div class='content_title task'></div><h3><%= I18n.t :task_all %></h3><%= escape_javascript(render('tasks/all_tasks', :tasks => @contact_tasks, :layout => 'normal')) %></div>");
        $('#content_input').html("<div class='content_title task'></div><h3><%= I18n.t :task_new_title %></h3><%= escape_javascript(render('tasks/new_task')) %></div>");
        $('a#tasks_tab').addClass('active');
    <% end %>

person John    schedule 07.08.2012    source источник


Ответы (2)


Предполагая, что ваш файл имеет расширение js.haml, я думаю, что все, что вам нужно сделать, это изменить теги <%= ... %> на стандартные теги интерполяции строк #{ ... }:

- if (@active == "tasks")
  :plain
    $('#content_output').html("<div class='content_title task'></div><h3>#{I18n.t :task_all}</h3>#{escape_javascript(render('tasks/all_tasks', :tasks => @contact_tasks, :layout => 'normal'))}</div>");
    $('#content_input').html("<div class='content_title task'></div><h3>#{I18n.t :task_new_title}</h3>#{escape_javascript(render('tasks/new_task'))}</div>");
    $('a#tasks_tab').addClass('active'); 
person Paul Fioravanti    schedule 07.08.2012

Попробуйте использовать :javascript вместо :plain

Кстати, в Rails 3 вы должны использовать ненавязчивый javascript (UJS). Ознакомьтесь с учебным пособием: http://railscasts.com/episodes/205-unobtrusive-javascript

person Lukas Stejskal    schedule 07.08.2012
comment
При использовании :javascript ничего не выполняется, щелчок по вкладкам не обновляет содержимое, но с :plain это происходит, за исключением того, что он показывает все между ‹%= %› как обычный текст. - person John; 07.08.2012
comment
О, я только что заметил, что у вас есть код Ruby, встроенный в Javascript. Я думаю, тогда нет простого пути - вы должны преобразовать его в UJS. В любом случае это лучшая практика. - person Lukas Stejskal; 07.08.2012