Перенаправление загрузки файла jquery на рельсы

Я использую jquery-file-upload для загрузки файлов.

После завершения загрузки файлов я хочу перенаправить на путь редактирования загруженного документа.

Я использую javascript для отправки файла:

return data.submit();

После завершения загрузки файла, как я могу перенаправить на edit_document_path, я пробовал следующий код:

$('#fileupload')
    .bind('fileuploadstop', function (e, data) {
        window.location.href = "#{edit_document_path(@document)}";
    })

Есть ли способ сохранить или вернуть идентификатор (или, что еще лучше, сам @document) загруженного документа, чтобы я мог перенаправить через js?


РЕДАКТИРОВАТЬ

У меня есть js прямо в файле html.haml

%script(type="text/javascript")
$('#new_document').fileupload({
dataType: 'json',

add: function (e, data) {
jqXHR = data.submit()
},

done: function (e, data) {
window.location = json.url
}, 

progress: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('.bar').css('width', progress + '%');
}
});

и вот мой контроллер:

def upload
  @document = Document.new(params[:document])
  respond_to do |format|
    format.json { render json: { url: edit_document_path(@document) } }
  end
end

Однако ответ JSON, похоже, не работает, поскольку страница не перенаправляется, что я делаю неправильно?

Спасибо


person Jeremy Lynch    schedule 06.08.2013    source источник


Ответы (1)


есть несколько вещей, которые вы должны учитывать. Во-первых, вы должны иметь возможность получить URL-адрес действия редактирования. Если ваш js находится на странице, а не в файле ресурсов, следующее изменение должно работать.

jqXHR = data.submit()
  .complete(function() { window.location = "#{url here}" })

вам также необходимо использовать <%= %>, если вы используете erb вместо #{...}. Если это находится в файле активов, у вас нет доступа к переменным экземпляра, поэтому вам придется полагаться на ответ сервера. Например, вы можете установить ответ как json.

$('#fileupload').fileupload({
  dataType: 'json',
  add: function(json) {
   jqXHR = data.submit()
    .complete(function() { window.location = json.url })
  }
})

поскольку вы используете json.url выше, он ожидает, что вы вернете URL-адрес в ответе json, поэтому в своем контроллере добавьте следующее в блок respond_to

format.json { render json: { url: edit_document_path(@document) } }
person jvnill    schedule 06.08.2013
comment
Большое спасибо за этот ответ. Что вы предлагаете добавить в #{url here}? edit_document_path(@document)? - person Jeremy Lynch; 06.08.2013
comment
ответ тот же. измените параметр добавления, чтобы он выглядел как мой ответ. - person jvnill; 07.08.2013