jQuery-fileupload-rails fileupload не определен при каждой попытке

Я пытаюсь отчасти следовать этим рельсам, чтобы получить jQuery- загрузчик файлов для работы в рельсах с несущей. У меня есть carrierwave и все остальное, работает отлично, но когда я пытаюсь использовать jquery-fileupload-rails, я получаю ту же ошибку: Uncaught TypeError: Object [object Object] has no method 'fileupload'. То же самое, когда я пытаюсь запустить $(selector).fileupload() в консоли.

Gemfile:

source 'http://rubygems.org'

gem 'rails', '3.2.16'

gem 'mysql2'
gem 'jquery-rails'
gem 'rest-client'
gem 'will_paginate'
gem 'simple_form'
gem 'chronic'
gem 'nokogiri'

gem 'carrierwave'

group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'uglifier'
  gem 'jquery-fileupload-rails'
end

приложение / активы / javascripts / application.js

//= require jquery
//= require jquery_ujs
//= require bootstrap
//= require bootstrap_ujs
//= require jquery-fileupload/basic
//= require_tree .

Также бывает, когда у меня //= require jquery-fileupload в приведенном выше списке.

Проверяю голову и все скрипты загружаются в правильном порядке:

<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/bootstrap.js?body=1" type="text/javascript"></script>
<script src="/assets/bootstrap_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-fileupload/vendor/jquery.ui.widget.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-fileupload/jquery.iframe-transport.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-fileupload/jquery.fileupload.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery-fileupload/basic.js?body=1" type="text/javascript"></script>
<script src="/assets/uploads.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>

При анализе скриптов в консоли разработчика:

  • Скрипт jquery-fileupload/basic.js - это всего 5 пустых строк ... Что это должно быть? Это должен быть пустой файл, потому что все, что он содержит, - это файлы, включаемые конвейером ресурсов.

  • Скрипт jquery-fileupload/jquery.fileupload.js полон вещей, но когда я копирую и вставляю весь этот файл в консоль и нажимаю Enter, он выводит:

Object function ( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); } has no method 'widget'

Я запускаю установку пакета, удаляю, затем переустанавливаю гем и перезапускаю сервер (несколько раз). После 5 часов неудач я начал все сначала и попробовал снова. Это не удалось.

ОБНОВЛЕНИЕ:

Если я скопирую и вставлю весь jquery-fileupload/vendor/jquery.ui.widget.js файл в консоль, а затем скопирую и вставлю весь jquery-fileupload/jquery.fileupload.js в консоль, я не получу ошибку, указанную выше, и метод fileuplaod внезапно станет доступным. Для меня это не имеет смысла, потому что, если он включен в заголовок в этом порядке, он должен работать в этом порядке и быть доступным при вызове $(selector).fileupload().


person Dustin Griffith    schedule 27.01.2014    source источник


Ответы (1)


С моим обновлением очевидно, что активы включаются неправильно. Я почти уверен, что это будет решено, когда все файлы javascript будут помещены в один большой файл, и они обязательно будут выполняться в правильном порядке, потому что они будут загружены вместе. Мне удалось решить проблему в среде разработки, вручную загрузив скрипты в правильном порядке, например:

jQuery ->
  $.getScript "/assets/jquery-fileupload/vendor/jquery.ui.widget.js", () ->
    $.getScript "/assets/jquery-fileupload/jquery.iframe-transport.js", () ->
      $.getScript "/assets/jquery-fileupload/jquery.fileupload.js", () ->
        $(selector).fileupload()

Это очень неэффективно, потому что он делает три запроса к серверу, ожидая загрузки предыдущего скрипта, прежде чем вызывать следующий. Его НЕ использовать в производственной среде. Я не уверен, как заставить application.js построить и использовать в разработке, но я буду работать над этим. Как только я смогу протестировать сервер в производственной среде, чтобы увидеть, работает ли он так, как я ожидаю, я обновлю этот ответ и приму его, если еще ни у кого нет лучшего.

Я начал сообщать об этом здесь в github.

person Dustin Griffith    schedule 28.01.2014
comment
Должно быть //require_tree ., нет? - person Richard Peck; 28.01.2014
comment
@RichPeck //= require_tree . действительно то, что должно быть. Это должен быть комментарий к вопросу. Это остаток того, что я возился с попытками исправить это, и я удалил строку дерева, а эту по ошибке оставил. Спасибо что подметил это. Это могло вызвать проблемы позже. - person Dustin Griffith; 28.01.2014