Uncaught TypeError: undefined не является функцией rails3/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

и this (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.

EDIT:

По предложению я пошел и фактически добавлен в жемчужину Jammit и настроил его, чтобы обслуживать все js-скрипты, которых по умолчанию Rails все не было. Теперь все сценарии идут в браузер (включая контроллер). К сожалению, это не решает исходную проблему, но только дает больше ошибок при загрузке, протекающих из App init, которая находится в консоли 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

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

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

#= require backbone
#= require query

Ответ 5

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