Rails JS Response, отображать статус и шаблон? - PullRequest
5 голосов
/ 07 марта 2012

В моем текущем приложении rails я использую ajax uploader библиотеку, которая требует, чтобы вы ответили json {success:true}, чтобы указать, что файл был успешно загружен.

В моем приложении файлы являются изображениями, и после загрузки я хотел бы добавить это на страницу. Обычно я бы сделал что-то вроде:

respond_to do |format|
  format.html { redirect_to @resource, :notice => 'Created.' }
  format.js
end

В приведенном выше примере мой ответ JS будет отображать соответствующий шаблон, такой как create.js.erb, который может сказать что-то вроде ...

$('#resources').append('<%= escape_javascript( render '@resource' ) %>');

Вот как я делал такие вещи, как комментарии Ajax и т. Д. В прошлом. Теперь, чтобы заставить загрузчик работать, мой блок respond_to в настоящее время делает это:

format.js { render :json => { :success => true } }

Это заставляет загрузчик работать, но, кажется, мешает мне добавлять отображаемые частички на страницу, как я обычно делаю с ответом Ajax.

У меня вопрос, есть ли способ выполнить оба? Если нет, как бы вы заполнили страницу отображаемыми объектами после того, как они были успешно созданы?

1 Ответ

4 голосов
/ 07 марта 2012

Вы не можете сделать оба непосредственно из контроллера или с помощью шаблонов представления.Похоже, что ajax uploader ожидает ответ, который может быть проанализирован как JSON, поэтому добавление любого другого ответа с использованием шаблона (что означает отсутствие format.js { render :json => { :success => true }}) не отправит обратно JSON в качестве тела ответа.

Глядя на source для плагина, вы можете увидеть, что вы можете определить метод для запуска onComplete, который даст вам ответ JSON.

Это не проверено, но вы должны получитьблизко.Таким образом, если вы расширите свой ответ JSON, например

format.js do
  partial = render_to_string @resource
  render :json => { :success => true, :partial => partial }
end

, то в своем javascript на странице при настройке загрузчика ajax добавьте обратный вызов

var uploader = new qq.FileUploader({
  element: document.getElementById('file-uploader'),
  action: '/upload',
  onComplete: function(id, fileName, responseJSON) {
    $('#resources').append(responseJSON.partial);
  }
}); 
...