Неперехваченная ошибка типа: неопределенный не является функцией rails3 / backbone / js

#javascript #ruby-on-rails #ajax #ruby-on-rails-3 #backbone.js

#javascript #ruby-on-rails #ajax #ruby-on-rails-3 #backbone.js

Вопрос:

Я только начал углубляться в javascript, чтобы сделать проект более отзывчивым, и я работаю через backbone.js пример.

Я скопировал http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example в новом проекте Rails 3.

Я запускаю проект и захожу на домашнюю страницу …. и там есть ссылка на /# и больше ничего. Заглядывая в консоль js, я получаю ошибки в двух скриптах: application.js и backbone.js

Это (backbone.js )

 backbone-min-0-3-3.js:8Uncaught TypeError: Cannot call method 'extend' of undefined
  

и это (application.js ):

 var App = {
        Views: {},
        Controllers: {},
        Collections: {},
        init: function() {

        new App.Controllers.Fffforms();
**error message ---> application.js:9Uncaught TypeError: undefined is not a function**
            Backbone.history.start();
        }
};
  

Будучи новичком в js, это не совсем имеет смысл, и ничто из того, что я искал, не было настолько полезным в краткосрочной перспективе.

Кто-нибудь может сказать мне, на что именно указывают эти ошибки и как я могу продолжить? Все проверяется при сравнении ресурсов в https://github.com/jamesyu/CloudEdit , но моя репликация из нового проекта rails 3 (не клона этого репозитория) точно не работает.

Любые предложения приветствуются, учитывая, что я только начал изучать javascript.

Редактировать:

По предложению я пошел и фактически добавил в Jammit gem и настроил его для обслуживания всех js-скриптов, которых в Rails all по умолчанию не было. Теперь все скрипты отправляются в браузер (включая контроллер). К сожалению, это не решает исходную проблему, а только выдает больше ошибок при загрузке, вытекающих из инициализации приложения, которая является this в консоли chrome js:

 Uncaught TypeError: undefined is not a function
App.initapplication.js:9
(anonymous function):3000/#new:32
d.extend._Deferred.f.resolveWithjquery.min.js:16
d.d.extend.readyjquery.min.js:16
d.c.addEventListener.yjquery.min.js:16
  

Учитывая, что я просто копирую прямо сейчас, должна быть какая-то небольшая упущенная деталь за пределами моего atm, которая препятствует правильной инициализации приложения.

Комментарии:

1. В консоли firefox я получаю разные ошибки Error: f не определено и Error: App.Controllers.Fffforms не является конструктором.

Ответ №1:

Похоже, вы не включаете файл, который содержит объявление App.Controllers.Fffforms . Убедитесь, что вы включаете этот файл где-то в свой код до того, как вы включаете application.js .

Комментарии:

1. Спасибо, я добавил еще несколько js, которых раньше не было, но все еще есть та же проблема.

Ответ №2:

Я предполагаю, что в вашем приложении есть своего рода механизм объединения. Убедитесь, что во всех файлах, входящих в комплект, правильно используются точки с запятой (;).

Ответ №3:

Мой ответ похож на ответ @ream88, но функция конвейера ресурсов Rails 3.1 заботится о минимизации, объединении и так далее, Поэтому я предпочитаю иметь не уменьшенные версии, доступные для отладки и т.д.

Итак, загрузите прокомментированную / полную версию backbone.js и underscore.js и сохраните их в app/assets/javascripts (вы также можете сохранить их в vendor/assets/javascripts ).

Разница в том, что вам следует обновить файл манифеста ( app/assets/javascripts/application.js ), чтобы добавить директивы require, например, так

 //= require jquery
//= require jquery_ujs
//= require underscore
//= require backbone
//= require_tree .
  

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

Комментарии:

1. Спасибо — моя глупость: подчеркивание должно быть первым. Является application.js и для //= требуется что-то rails?

Ответ №4:

Столкнулся с той же проблемой, а затем выяснил, что я нигде не включил underscore.js . Итак, я написал простой backbone.js файл:

 /*
 *= require backbone/underscore-min.js
 *= require backbone/backbone-min.js
 */
  

и сохранил ее под vendor/assets/javascripts вместе с файлами Backbone и подчеркивания:

 vendor/assets/javascripts/
├── backbone
│   ├── backbone-min.js
│   └── underscore-min.js
└── backbone.js
  

Мой application.js.coffee теперь выглядит примерно так:

 #= require backbone
#= require query
  

Ответ №5:

Это просто задело меня, поэтому я подумал, что поделюсь своей находкой: убедитесь, что окончания строк вашего файла соответствуют файловой системе вашего сервера.