Rails удаленный бросок формы SyntaxError - PullRequest
2 голосов
/ 25 мая 2011

У меня есть следующая форма:

<%= form_for [@commentable, Comment.new], :remote => true do |f| %>
  <%= f.text_area :body %>
  <%= f.submit "Add your comment" %>
<% end %>

Затем контроллер (сильно урезанный до базовой части):

def create
  respond_with(@comment) do |format|
    format.html { redirect_to params[:return_url] }
    format.json { render :layout => !request.xhr? }
  end
end

Тогда вот javascript для обработки формы AJAX:

$('#new_comment')
  .bind('ajax:success', function(evt, data, status, xhr){
    var $this = $(this);

    // Append response HTML (i.e. the comment partial or helper)
    $('#comments ol').append(xhr.responseText);
    $('#comments ol li:last-child').effect("highlight", {}, 3000);

    // Clear out the form so it can be used again
    $this.find('input:text,textarea').val('');

    // Clear out the errors from previous attempts
    $this.find('.errors').empty();
  })
  .bind('ajax:error', function(evt, xhr, status, error){
    // Display the errors (i.e. an error partial or helper)
    $(this).find('.errors').html(xhr.responseText);
  });

Форма отправляется в порядке, и комментарий добавляется, как и должно быть, но веб-инспектор Safari показывает SyntaxError: Parse error в строке 1 (это просто тип документа) любой страницы, на которой я нахожусь, когда отправляется форма комментария, и Я не могу понять, почему.

Даже не уверен, с чего начать.

Ответы [ 4 ]

1 голос
/ 29 августа 2011

Я получил эту ошибку, и это потому, что удаленный вызов ajax ожидал JavaScript, а я возвращал html.Вызов .ajax был по умолчанию для dataType 'script', поэтому, когда он получил результат ajax, он попытался оценить его, и любые теги <вызвали ошибку.</p>

Я избавился от ошибки, изменив представление с .js.erb на .html.erb и добавив 'data-type' => 'html' к ссылке, содержащей :remote => true.

В некоторых случаяхможет иметь смысл иметь саму форму в виде фрагмента JavaScript - что-то вроде:

$('#container').replace("<%= escape_javascript(render(...)) %>");

Тогда вы можете опустить тип данных из ссылки.

Дополнительная информация о типе данных здесь .

0 голосов
/ 25 мая 2011

Я думаю, что вы смотрите не на ту строку 1 - если вы включаете файлы JavaScript, это может означать строку 1 одного из них.Это также может означать строку 1 того, что отправляется обратно.

Если честно - попробуйте Chrome и включите отладку, Chrome гораздо лучше скажет, какой файл вызвал проблему и где.

Вам все равно не нужно помещать весь JQuery в ваш файл - вы можете написать ответ в виде, если у вас установлены правильные гемы - не уверен, поможет ли это.

0 голосов
/ 09 июня 2011

У вас есть div на странице с классом "ошибки"? У меня была очень похожая проблема, и я нашел этот вопрос во время поиска решения.

Моя проблема заключалась в том, что мы пытались написать обратно в несуществующий div (из-за исключения .empty? На странице). Когда мы решили это, обратный вызов успеха сработал.

0 голосов
/ 25 мая 2011

Попробуйте сделать вызов bind на той же линии, что и ссылка new_comment:

$('#new_comment').bind('ajax:success', function(evt, data, status, xhr){
...