эрб в кофейном скрипте с рельсами 3.1 - PullRequest
28 голосов
/ 28 июня 2011

Я хотел бы использовать некоторые erb в моих .coffee файлах, как в следующем примере

myLatlng: new google.maps.LatLng(<%=@location.latitude %>, <%=@location.longitude %>)

Я переименовал свой locations.js.coffee в locations.erb.coffee

но я все еще получаю следующую ошибку

Error compiling asset application.js:
ExecJS::ProgramError: Error: Parse error on line 4: Unexpected 'COMPARE'
  (in /Users/denisjacquemin/Documents/code/projects/geolog/app/assets/javascripts/locations.erb.coffee)
Served asset /application.js - 500 Internal Server Error

Ответы [ 5 ]

76 голосов
/ 23 ноября 2011

Если вы хотите использовать erb в папке .coffee в папке YOUR VIEW, оставьте ваш файл с именем yourfilename.js.coffee, и Rails все равно будет обрабатывать ERB, как ни странно.

Чтобы заставить это работать в Heroku, переместите рельсы кофе из группы активов в вашем Gemfile.

13 голосов
/ 28 июня 2011

Возможно, вам придется переименовать файл в location.coffee.erb, чтобы перед обработкой кофе обрабатывался erb:)

4 голосов

Придерживайтесь конвейера ресурсов, когда это возможно в Rails 4 , вместо использования js.erb представления.

Передайте переменные в Js, используя gon или другой метод, обсуждаемый по адресу: Ruby on Rails - Отправьте переменную JavaScript из контроллера во внешний файл ресурсов Javascript

С gon:

Приложение / просмотров / макеты / application.html.erb:

<head>
  <meta charset="utf-8"/>
  <%= include_gon %>

приложение / контроллеры / application_controller.rb:

before_filter do
  gon.latitude = 0.1
  gon.longitude = 0.2
end

Приложение / активы / JavaScripts / locations.js.coffee:

myLatlng: new google.maps.LatLng(gon.latitude, gon.longitude)

Этот метод быстрее, поскольку файл при компиляции предварительно компилируется только один раз, обслуживается сервером, а не через Rails, и по тому же HTTP-запросу, что и остальные Js.

4 голосов
/ 05 января 2013

В Rails 3.2.8 мне не нужно было перемещать мой файл .coffee в / app / views.Я просто добавил .erb к имени файла и оставил его в / app / assets / javascripts.То есть.Я изменил

/app/assets/javascripts/user_answers.coffee.js to 
/app/assets/javascripts/user_answers.coffee.js.erb

, и тогда это сработало:

# Note the level of indentation.
var x = 2;

<% Question.first(2).each do |eq| %>
alert('eq: ' + <%= eq.id %>)
<% end %>

(Уровень отступа должен совпадать в CoffeeScript, а не в Ruby.) Наслаждайтесь кофе, встроенным в рубины.

1 голос
/ 04 мая 2016

Я согласен с Чиро Центелли, чтобы он оставил конвейер активов в покое, особенно если вы используете Heroku.Без сомнения gon полезно, если вам нужно много заданий, но вы также можете сделать это без драгоценного камня.В ваш html включите

<%= javascript_tag do %>
    window.latitude = <%=@location.latitude %>
    window.longitdue = <%= @location.longitude %>
<% end %>

и в вашем кофейном файле

myLatlng: new google.maps.LatLng(window.latitude, window.longitude)

Вы можете часто обходить другие потребности подобным образом.Например, если вы не хотите, чтобы кофейный скрипт запускался на элементе с определенным идентификатором, то в html используйте erb, чтобы добавить этот идентификатор только тогда, когда вы хотите, чтобы он срабатывал.

...