Подтвердить что ты не робот

Ошибка "Не могу найти переменную" с Rails 3.1 и Coffeescript

У меня есть представления в моем приложении, которые ссылаются на мой файл application.js, который содержит функции, которые я использую во всем приложении.

Я только что установил кандидата релиза Rails 3.1 после использования граничной версии 3.1. Пока я не установил RC, у меня не было никаких проблем, но теперь я получаю эту ошибку:

ReferenceError: не удается найти переменную: indicator_tag

indicator_tag - это функция, определенная в application.js. Единственное отличие, которое я заметил в файле javascript, это то, что теперь все мои функции завернуты в:

(function() { ... }).call(this);

Я понимаю, что это переменная область видимости? Но может ли это мешать моим страницам использовать эти переменные? И прежде чем кто-нибудь спросит, я убедился, что пути javascript верны в моих тегах include.

4b9b3361

Ответ 1

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

В верхней части каждого файла coffeescript добавьте строку типа

window.Application ||= {}

Это обеспечит постоянное присутствие глобального приложения Application.

Теперь для каждой функции, которую вам потребуется вызвать из другого файла, определите их как

Application.indicator_tag = (el) ->
  ...

и вызовите их, используя

Application.indicator_tag(params)

Ответ 2

Решение Dogbert - отличный способ пойти, если у вас очень сложный JS-сервер. Однако есть гораздо более простое решение, если у вас есть только несколько функций, с которыми вы работаете. Просто добавьте их непосредственно к объекту окна, например:

window.indicator_tag = (el) ->
  ...

Затем вы можете использовать свои функции из любого места, не сводя их к другому объекту.