咖啡脚本中的erb与rails 3.1

时间:2011-06-28 09:05:47

标签: ruby-on-rails erb coffeescript

我想在我的.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

5 个答案:

答案 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。