Как получить доступ к переменным экземпляра в движке CoffeeScript внутри шаблона Slim
У меня есть контроллер Rails, в котором я устанавливаю переменную экземпляра -
@user_name = "Some Username"
В моем шаблоне .slim я использую кофе-движок для генерации javascript и хочу распечатать имя пользователя из кода javascript с клиентом -
coffee:
$(document).ready ->
name = "#{@user_name}"
alert name
Но это javascript, который генерируется??
$(document).ready(function() {
var name;
name = "" + this.my_name;
alert(name);
}
Как получить доступ к переменным экземпляра контроллера в моем коде CoffeeScript?
Я отмечаю это как haml, так как я предполагаю, что haml будет иметь такую же проблему при использовании CoffeeScript.
Ответы
Ответ 1
Что происходит, когда "#{@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
Ответ 2
Я стараюсь избегать встроенного javascript любой ценой.
Хорошим способом хранения переменных в вашем HTML, который будет использоваться из вашего javascript, является использование атрибутов данных HTML5. Это идеально, чтобы ваш javascript был ненавязчивым.
Ответ 3
Вы также можете использовать:
$(document).ready ->
name = <%= JSON.generate @user_name %>
alert name
Это связано с тем, что JSON является подмножеством JavaScript.