Как получить доступ к переменным экземпляра в движке CoffeeScript внутри шаблона Slim

У меня есть controller Rails, в котором я устанавливаю переменную экземпляра –

@user_name = "Some Username" 

В моем шаблоне .slim я использую кофе-движок для генерации javascript и хочу распечатать имя пользователя из кода JavaScript javascript,

 coffee: $(document).ready -> name = "#{@user_name}" alert name 

Но это javascript, который генерируется ??

 $(document).ready(function() { var name; name = "" + this.my_name; alert(name); } 

Как получить доступ к переменным экземпляра controllerа в моем коде CoffeeScript?

Я отмечаю это как haml, так как я предполагаю, что haml будет иметь такую ​​же проблему при использовании CoffeeScript.

Что происходит, так это то, что "#{@user_name}" интерпретируется как CoffeeScript, а не как код Ruby, который оценивается и вводится в источник CoffeeScript. Вы спрашиваете: «Как мне вставить переменную Ruby в мой источник CoffeeScript?»

Короткий ответ: Не делайте этого. Команда Rails приняла намеренное решение не поддерживать встроенный CoffeeScript в шаблонах в 3.1, потому что есть существенные накладные расходы на производительность для компиляции CoffeeScript по каждому запросу (как и следовало бы делать, если бы вы разрешали произвольные строки вводить в исходный код) ,

Мой совет состоит в том, чтобы обслуживать ваши переменные Ruby отдельно как чистый JavaScript, а затем ссылаться на эти переменные из вашего CoffeeScript, например:

 javascript: user_name = "#{@user_name}"; coffee: $(document).ready -> name = user_name alert name 

Я стараюсь избегать встроенного javascript любой ценой.

Хорошим способом хранения переменных в вашем HTML, который будет использоваться из вашего javascript, является использование атрибутов данных HTML5. Это идеально, чтобы ваш javascript был ненавязчивым.

Вы также можете использовать:

 $(document).ready -> name = <%= JSON.generate @user_name %> alert name 

Это связано с тем, что JSON является подмножеством JavaScript.

Давайте будем гением компьютера.