erb в сценарии кофе с рельсами 3.1

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

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

Я переименовал свой 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

person denisjacquemin    schedule 28.06.2011    source источник


Ответы (5)


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

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

person Arcolye    schedule 23.11.2011
comment
Очень интересно. Такого результата вообще не ожидал. - person John; 04.03.2012
comment
Было бы неплохо найти эту функцию где-нибудь задокументированной, чтобы в какой-то момент все мы не обнаружили, что это на самом деле ошибка... - person opsidao; 29.06.2012
comment
Только что попробовал в Rails 3.2.6, и это не сработало. Пришлось переименовать locations.js.coffee в locations.js.coffee.erb - person Brian Armstrong; 05.07.2012
comment
странно добавление .erb к location.js.coffee.erb в моем файле просмотра не работает, но избавление от .erb работает. - person shicholas; 10.01.2013
comment
У меня 3.2.12 и файлы .js.coffee.erb не работают. Я должен переименовать их в .js.coffee, и они работают, хотя у них есть erb. Иди разберись. - person Tom Rossi; 01.03.2013
comment
Я использую Rails 4.2.0, и это работает. Похоже, что Rails может использовать только один обработчик для шаблона вместо конвейера обработчиков. Если у кого-то все еще есть ActionView::Template::Error, я предлагаю проверить правильность вашего отступа. - person darkbaby123; 12.01.2015

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

person Clément    schedule 28.06.2011
comment
В вашей ошибке скрипт кофе пытается выполнить тег erb ‹%... - person Clément; 28.06.2011
comment
полное объяснение можно найти здесь ryanbigg.com/guides/asset_pipeline.html#preprocessing - person denisjacquemin; 28.06.2011
comment
Я пытался сделать это в своем file.coffee.js.erb, но это не сработало и привело к ошибке компиляции emailRegex = <%= Devise.email_regexp %> - person vipin8169; 18.03.2016
comment
Предоставленная ссылка в комментарии, сделанном @denisjacquemin, кажется, возвращает 404. Однако я нашел документацию rails по предварительной обработке конвейера ресурсов хорошим объяснением того, как rails предварительно обрабатывает расширения файлов и в каком порядке: guides.rubyonrails.org/asset_pipeline.html#preprocessing. Additional layers of preprocessing can be requested by adding other extensions, where each extension is processed in a right-to-left manner. These should be used in the order the processing should be applied. - - person Nappstir; 05.04.2019

Придерживайтесь конвейера ресурсов, когда это возможно в 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.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 11.11.2014

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

person David Beckwith    schedule 05.01.2013
comment
но это больше не сработало для меня, когда я развернулся на героку. Но на моей машине все работало. Любые дальнейшие идеи? - person zabumba; 08.05.2013
comment
Я пытался сделать это в своем file.coffee.js.erb, но это не сработало и привело к ошибке компиляции emailRegex = <%= Devise.email_regexp %> - person vipin8169; 18.03.2016

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

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

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

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

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

person Obromios    schedule 04.05.2016