Как получить доступ к переменным экземпляра в движке CoffeeScript внутри шаблона Slim - PullRequest
49 голосов
/ 13 ноября 2011

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

@user_name = "Some Username"

В моем шаблоне .slim я использую кофейный движок для генерации javascript и хочу распечатать имя пользователя из кода client-sie 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.

Ответы [ 3 ]

91 голосов
/ 13 ноября 2011

Происходит то, что "#{@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
32 голосов
/ 13 ноября 2011

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

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

2 голосов
/ 13 сентября 2012

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

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

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

...