Проблема jQuery + Rails + ajaxForm + js.erb

У меня проблема, которая сводит меня с ума, и судя по всему, что я видел и читал в Интернете, все должно работать нормально.

Я использую jQuery с моим приложением Rails вместо прототипа и использую плагин ajaxForm для отправки некоторых данных формы через ajax. Данные формы отправляются в порядке, соответствующее действие контроллера вызывается в порядке, правильный блок response_to для типа js вызывается в порядке.

Проблема возникает в том, что содержимое файла *.js.erb возвращается браузеру клиента, а не интерпретируется как javascript. На самом деле с ним ничего не происходит. Да, я установил dataType: 'script', но он все еще не работает. Я также пытался не использовать плагин ajaxForm и вручную использовать функцию $.post при отправке формы, но результат все тот же.

для некоторых примеров кода, вот мой вызов ajaxForm:

$("#purchase-item-form").ajaxForm({ 
  dataType: 'script'
});

Я также правильно устанавливаю заголовок accepts, это работает нормально, потому что мой блок format.js выполняется

jQuery.ajaxSetup({
  'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript") }
});

в моем файле действия *.js.erb все, что у меня есть, это предупреждение на данный момент, чтобы помочь в отладке проблемы, пока я не разберусь с ней:

alert("action processed successfully");

Это просто не работает в firefox или сафари. Если я посмотрю в консоль firebug, я увижу, что оператор предупреждения возвращается как ответ на вызов ajax, он просто не оценивается клиентом как javascript.

К вашему сведению, я использую Rails 2.3.4 и jQuery 1.3.2, если это имеет значение.


person cpjolicoeur    schedule 01.10.2009    source источник


Ответы (1)


Я столкнулся с ТОЧНОЙ той же проблемой. Вы должны вручную eval вернуть код. Я точно не помню, почему он не оценивается, но я использовал те же плагины, что и вы, и это исправило это.

Редактировать 1: Чтение статью, так как она помогла решить проблему.

Изменить 2. Попробуйте следующее:

$("#purchase-item-form").ajaxForm({ 
  dataType: 'script',
  success: evalResponse
});

function evalResponse(responseText, statusText) {
  eval(responseText);
}

Подробнее см. здесь.

person Topher Fangio    schedule 01.10.2009
comment
можно немного подробнее, что вы имеете в виду? оценить это как? - person cpjolicoeur; 01.10.2009
comment
спасибо за ссылку. Я добавил параметр dataType в глобальный $.ajaxSetup, и, похоже, проблема устранена. странно, что эта встроенная опция dataType не имеет значения, но спасибо за помощь. - person cpjolicoeur; 01.10.2009
comment
Рад, что ты понял, что не так, хотя я продолжал менять свой ответ =P - person Topher Fangio; 01.10.2009
comment
Можем ли мы получить некоторую ясность здесь... достаточно ли eval? +1 во всех случаях. - person Dan Rosenstark; 01.10.2009
comment
поэтому я даже не пробовал использовать метод evalResponse из приведенного выше кода Тофера. Я просто добавил параметр dataType: script в свой глобальный метод $.ajaxSetup(). Я не знаю почему, но это заставило это работать. По какой-то причине встроенный параметр dataType: script в функции ajaxForm не распознается браузером. - person cpjolicoeur; 01.10.2009