Rails не выполняет javascript из блока response_to - PullRequest
1 голос
/ 02 декабря 2009

У меня проблема с рельсами, которые не выполняют JS в шаблоне. У меня есть ответ на блок в моем контроллере, который выглядит так:

respond_to do |format|
  format.js   {}      
end

и правильный файл в представлениях, но когда он рендерит, он на самом деле просто печатает JS, как будто mime-тип неправильный. (файл add_item.js.erb)

Например, если бы я имел это в качестве теста на мой взгляд:

<%= "alert('running');" %>

но когда это действие выполняется в контроллере, страница перенаправляется и выводится HTML-код самого JS:

alert('running');

Ответы [ 5 ]

1 голос
/ 02 декабря 2009

Я собирался прокомментировать ответ автора, но слишком много кода для публикации ... Вы могли бы немного ужесточить JS. Во-первых, вы, вероятно, захотите установить заголовки глобально, а не на каждый запрос, и если вы делаете сообщение, вам нужно проделать еще немного работы:

$(document).ajaxSend(function(event, xhr, settings) {
  xhr.setRequestHeader("Accept", "text/javascript, application/javascript");     
});

Использование getScript также сделает код короче:

$("a.add_line_item").click(function() {
  .getScript(this.href); 
});

У меня также есть сообщение в блоге о запросах на публикацию сообщений из jQuery в Rails, которые могут вас заинтересовать.

1 голос
/ 02 декабря 2009

Такое поведение Rails правильное. Однако вы не предоставляете, как вы называете эту страницу JS в вашем представлении (link_to_remote?)

Большинство людей забывают, что другие вспомогательные методы JS (link_to_remote и т. Д.) Выполняют eval(response). Если вы пишете собственный JavaScript (как я сделал с jQuery), вы должны добавить eval(...) самостоятельно.

РЕДАКТИРОВАТЬ Вот пример:

$.ajax({
  url: "foo",
  type: 'post',
  success: function(data) {
    eval(data);
  }
});
0 голосов
/ 02 декабря 2009

Понял, это была проблема JS, я использую метод ajax, который jQuery предоставляет как таковой.

$("a.add_line_item").click( function() {
  $.ajax({
    url: this.href,
    dataType: "script",
    beforeSend: function(xhr) {xhr.setRequestHeader("Accept", "text/javascript");},
  });
 return false;
});
0 голосов
/ 02 декабря 2009

Как вы называете это действие? Вы используете опцию: update в удаленном помощнике?

Я видел, как он ведет себя так, если вы используете удаленного помощника с установленным параметром: update, а затем пытаетесь отправить назад определенный файл replace_html или аналогичный вызов с использованием rjs на стороне контроллера.

0 голосов
/ 02 декабря 2009

Попробуйте это:

<script type="text/javascript">
<%= "alert('running');" %>
</script>

Не уверен, что вы пытаетесь сделать, но вы не можете просто загрузить текстовый код javascript в браузер и ожидать его запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...