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
Ответы
Ответ 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, чтобы добавить только этот идентификатор, когда вы хотите его запустить.