Ошибка "Не могу найти переменную" с 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.
Ответы
Ответ 1
По умолчанию каждый файл CoffeeScript скомпилирован в закрытие. Вы не можете взаимодействовать с функциями из другого файла, если вы не экспортируете их в глобальную переменную. Я бы рекомендовал сделать что-то вроде этого:
В верхней части каждого файла coffeescript добавьте строку типа
window.Application ||= {}
Это обеспечит постоянное присутствие глобального приложения Application.
Теперь для каждой функции, которую вам потребуется вызвать из другого файла, определите их как
Application.indicator_tag = (el) ->
...
и вызовите их, используя
Application.indicator_tag(params)
Ответ 2
Решение Dogbert - отличный способ пойти, если у вас очень сложный JS-сервер. Однако есть гораздо более простое решение, если у вас есть только несколько функций, с которыми вы работаете. Просто добавьте их непосредственно к объекту окна, например:
window.indicator_tag = (el) ->
...
Затем вы можете использовать свои функции из любого места, не сводя их к другому объекту.