Ответ format.js не выполняется - PullRequest
0 голосов
/ 17 марта 2010

Я использую Rails 3.0.0 Beta

после действия мое представление RJS возвращает JavaScript, но код не выполняется

В Firebug я вижу в своем ответе

$('polaroids').insert("<li>\n  <a title=\"4204497503_a0c43c561d.jpg\" href=\"#\">\n    <img alt=\"4204497503_a0c43c561d.jpg\" src=\"/system/photos/279/original/4204497503_a0c43c561d.jpg?1268857318\" />\n  <\/a>\n<\/li>")

Вот javascript, который генерирует запрос

function send(file, url) {
    try {
        var xhr = new XMLHttpRequest;

        var boundary    = generateBoundary();

        var contentType = "multipart/form-data; boundary=" + boundary;

        xhr.upload.addEventListener("loadstart", (function(e){
            $('progress_'+file.name).update('0%');
        }), false);

        xhr.upload.addEventListener("progress", (function(e) {
              if (e.lengthComputable) {
                  var percentage = Math.round((e.loaded * 100) / e.total);
                  $('progress_'+file.name).update(percentage + '%');
              }
        }), false);


        xhr.open("POST", url, true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
               // done
            }
        };

        xhr.setRequestHeader("Content-Type", contentType);
        xhr.setRequestHeader("Accept", "text/javascript");

        var CRLF  = "\r\n";
        var request = "--" + boundary  + CRLF;

        request += 'Content-Disposition: form-data; ';
        request += 'name="' + 'photo[name]' + '"' + CRLF + CRLF;
        request += file.name + CRLF;

        request += "--" + boundary + CRLF;

        request += 'Content-Disposition: form-data; ';
        request += 'name="' + 'photo[photo]' + '"; ';
        request += 'filename="'+ file.fileName + '"' + CRLF;

        request += "Content-Type: application/octet-stream" + CRLF + CRLF;
        request += file.value + CRLF;
        request+= "--" + boundary + "--" + CRLF;

        xhr.sendAsBinary(request);

    } catch(e) {
        alert('send Error: ' + e);
    }
}

Вот контроллер

  def remote_create
    @photo = Photo.new(params[:photo])
    @photo.save
    respond_to do |format|
      format.js
    end
  end

Вот заголовок ответа

Response Headers
Etag    "7343b21b2f062fb74b7d5f32e3a83c2c"
Connection  Keep-Alive
Content-Type    text/javascript; charset=utf-8
Date    Wed, 17 Mar 2010 20:21:58 GMT
Server  WEBrick/1.3.1 (Ruby/1.8.7/2008-08-11)
X-Runtime   0.060497
Content-Length  220
Cache-Control   max-age=0, private, must-revalidate
Set-Cookie  _photos_session=BAh7ByIQX2NzcmZfdG9rZW4iMS9OWnpOZUR6UGQ2UDhvbGt5YWpTWXhJcFR2YjRHOEhzZHlIbmdMblRlMWs9Ig9zZXNzaW9uX2lkIiUxNjlhOWYzNjQxODE2N2NjN2FiNmYzY2VkYmU3OTgwYQ%3D%3D--022d7202178b2cc7bf968e558c2ae67ecef1fb74; path=/; HttpOnly

Нужно ли что-нибудь особенное, чтобы это работало?

Ответы [ 3 ]

1 голос
/ 31 мая 2012

Для тех, кто, как и я, столкнулся с проблемой с Ajax File Uploader и Carrierwave, не выполняющей возвращенный javascript, это связано с тем же. Это потому, что File-Uploader написан так, чтобы предполагать, что все, что ему возвращено, является JSON, и переписывает его для оценки responseText, вместо того, чтобы помещать его в переменную, исправляет это.

Я публикую сообщения целиком, чтобы никто больше не тратил часы, думая, что ошибки - это причина.

0 голосов
/ 21 марта 2010

Я нашел решение, мой Ajax-запрос собран вручную, я не использую Prototype или jQuery. Чтобы JavaScript был выполнен в ответе, я должен добавить следующий код

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        eval(xhr.responseText || '');
    }
};
0 голосов
/ 19 марта 2010

Ошибка вашей JS:

$('polaroids').insert("<li>\n  <a title=\"4204497503_a0c43c561d.jpg\" href=\"#\">\n    <img alt=\"4204497503_a0c43c561d.jpg\" src=\"/system/photos/279/original/4204497503_a0c43c561d.jpg?1268857318\" />\n  <\/a>\n<\/li>")

Возможно, вы хотите нацелить div или какой-либо элемент на id или class, но у вас просто есть $('polaroids'), попробуйте, возможно, $('.polaroids') или $('#polaroids') в зависимости от того, на что похож ваш html.

...