我想在我的.coffee
文件中使用一些erb,如下例
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
答案 0 :(得分:76)
如果你想在你的视图文件夹中的.coffee
文件中使用erb,请保留名为yourfilename.js.coffee
的文件,并且Rails仍然会处理ERB,奇怪的是。
要使它在Heroku中运行,请将咖啡轨移出Gemfile中的资产组。
答案 1 :(得分:13)
您可能需要将文件重命名为locations.coffee.erb,以便在咖啡之前处理erb:)
答案 2 :(得分:4)
在Rails 3.2.8中,我没有必要将.coffee文件移动到/ app / views。我刚刚将.erb添加到文件名并将其保留在/ app / assets / javascripts中。 IE浏览器。我改变了
/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。)享受嵌入红宝石的咖啡。
答案 3 :(得分:4)
在Rails 4中坚持使用资产管道,而不是使用js.erb
视图。
使用gon或其他一些技术将变量传递给Js:Ruby on Rails - Send JavaScript variable from controller to external Javascript asset file
使用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
应用程序/资产/ Javascript角/ locations.js.coffee:
myLatlng: new google.maps.LatLng(gon.latitude, gon.longitude)
此方法更快,因为文件在启动时仅预编译一次,由服务器而不是通过Rails提供服务,并且与其他Js在相同的HTTP请求上。
答案 4 :(得分:1)
我同意Ciro Centelli单独留下资产管道,特别是如果你使用的是Heroku。毫无疑问,gon
如果您需要进行多次分配,则非常有用,但您也可以在没有宝石的情况下执行此操作。在您的HTML包含
<%= javascript_tag do %>
window.latitude = <%=@location.latitude %>
window.longitdue = <%= @location.longitude %>
<% end %>
并在您的咖啡文件中
myLatlng: new google.maps.LatLng(window.latitude, window.longitude)
您经常可以以类似的方式解决其他需求。例如,如果您不希望咖啡脚本在具有特定ID的元素上触发,那么在html中使用erb仅在您想要触发时添加该ID。