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

Erb в кофе script с рельсами 3.1

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

myLatlng: new google.maps.LatLng(<%[email protected] %>, <%[email protected] %>)

Я переименовал my 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
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

В 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.) Наслаждайтесь кофе, встроенным в рубины.

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

Ответ 5

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

<%= javascript_tag do %>
    window.latitude = <%[email protected] %>
    window.longitdue = <%= @location.longitude %>
<% end %>

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

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

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