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


person kapso    schedule 13.11.2011    source источник
comment
@Thilo Нет, он пытается внедрить переменную Ruby @user_name. Ruby и CoffeeScript используют один и тот же синтаксис интерполяции строк.   -  person Trevor Burnham    schedule 13.11.2011
comment
Я понимаю. Кстати, почему имя переменной меняется с "#{@user_name}" на this.my_name?   -  person Thilo    schedule 13.11.2011
comment
Потому что в coffeescript @prop компилируется в this.prop.   -  person Cameron Martin    schedule 16.08.2012
comment
stackoverflow.com/questions/17560864/ Аналогичный вопрос/решение   -  person MrYoshiji    schedule 23.10.2013


Ответы (3)


Происходит то, что "#{@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
person Trevor Burnham    schedule 13.11.2011
comment
спасибо за ваш ответ, так что в основном то, что вы предложили, нормально с точки зрения производительности? - person kapso; 13.11.2011
comment
Это зависит от того, перекомпилирует ли Slim CoffeeScript в шаблоне при каждом запросе. Я честно не уверен. В любом случае вам, вероятно, следует переместить его во внешний файл; тогда он будет скомпилирован в JS только один раз, и браузеры будут кэшировать его. - person Trevor Burnham; 13.11.2011

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

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

person nathanvda    schedule 13.11.2011
comment
Это бесполезно, если вы используете JavaScript MVC и хотите избежать нескольких HTTP-запросов к серверу. backbonejs.org/#FAQ-bootstrap - person jackyalcine; 29.01.2014
comment
Если вы используете javascript MVC, вы в основном делаете запросы ajax для получения данных и все равно отображаете html на клиенте. Но, например, общие параметры конфигурации, которые вы все равно можете отправить один раз в атрибутах данных в файле html/body/container. - person nathanvda; 29.01.2014
comment
Правда правда. Извините, если я оторвался очень опрометчиво! - person jackyalcine; 30.01.2014

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

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

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

person gene tsai    schedule 12.09.2012
comment
Это тяжело. Или, по крайней мере, внутри файлов Dashing .coffee. - person Jameson Triplett; 03.12.2016