jQuery-fileupload-rails文件上载在每次尝试时都是未定义的

时间:2014-01-27 22:51:13

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 jquery-fileupload-rails

我试图稍微关注this rails cast以使jQuery-fileuploader在带有carrierwave的rails中工作。我有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

应用程序/资产/ Javascript角/ 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个空行......这应该是什么? This应该是一个空白文件,因为它包含的是文件到包含在资产管道中。

  • jquery-fileupload/jquery.fileupload.js脚本充满了各种东西,但当我将整个文件复制并粘贴到控制台并点击输入时输出:

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'

我正在运行bundle install,卸载然后重新安装gem并重启服务器(多次)。经过5个小时的失败后,我开始全身心地再次尝试。它失败了。

更新

如果我复制将整个jquery-fileupload/vendor/jquery.ui.widget.js文件粘贴到控制台,则将整个jquery-fileupload/jquery.fileupload.js复制粘贴到控制台中我没有得到上面列出的错误,并且fileuplaod方法可以突然调用。这对我来说没有意义,因为如果它按此顺序包含在头部中,它应按此顺序运行并在调用$(selector).fileupload()时可用。

1 个答案:

答案 0 :(得分:0)

通过我的更新,很明显可以看到资产未被正确包含。我几乎肯定当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()

这是非常低效的,因为它向服务器发出三个请求,等待上一个脚本加载,然后再调用下一个脚本。这应该 NOT 在生产环境中使用。我不确定如何让application.js构建并用于开发,但我将继续努力。一旦我可以在生产环境中测试服务器,看看它是否像我预期的那样工作,我将更新这个答案并接受它,如果还没有人有更好的答案。

我在github上开始讨论这个问题here