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

Как получить доступ к переменным экземпляра в движке 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.

4b9b3361

Ответ 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.