我可以在render.js上执行的视图中使用CoffeeScript吗?

时间:2011-06-03 09:17:00

标签: ruby-on-rails ruby coffeescript

我需要做什么才能在Rails JS视图中使用CoffeeScript?例如:

def index
    format.js { render :layout => false } 
end

为了让Rails使用index.js.coffee,我需要做些什么?

4 个答案:

答案 0 :(得分:15)

约翰尼的回答是正确的。如果您查看pull request页面中链接到的CoffeeBeans,就可以说

  

一旦我们有一个快速,干净的实施,它的核心是受欢迎的。但是,3.2更可能是目标。

我在Railsconf上简要地与Sam Stephenson和Josh Peek讨论了这个问题,因为这是人们在我的CoffeeScript谈话之后问过我的一个缺失的功能。毕竟,Rails 3.1正在推动CoffeeScript作为默认设置;有些地方需要使用纯JS,这似乎很奇怪。 Sam的反应是,这不会有效,因为您必须在每个页面请求上启动CoffeeScript编译器,即使在生产中也是如此。这是因为像

这样的代码
<%= coffee_script_tag do %>
  alert "coffee script is #{verb}!"
<% end %>

创建一个ERB插值(不是使用相同语法的CoffeeScript插值 - 不幸),可能会在每个请求上产生不同的CoffeeScript代码字符串。并且从coffee_script_tag实现中无法判断给定代码是否每次都相同(即是否存在ERB插值)。

现在,CoffeeScript编译器速度非常快,但是编译为JavaScript仍然会为每个请求增加一些额外的时间。因此,Rails团队对于鼓励这种做法犹豫不决。

为了提高效率,并避免ERB插值和CoffeeScript插值之间的歧义,您应该将CoffeeScript保存在某处(可能作为.coffee文件放在与视图相同的目录中)并将其编译为手工编写JavaScript。

答案 1 :(得分:13)

3.1尚未支持。您需要使用Coffeebeans


更新:现在支持rails 3.2

答案 2 :(得分:10)

现在正在使用Rails 3.2。例如,我有一个名为book的资源。此资源在app / views / books / index.html.erb中有一个文件,其中包含以下内容:

<%= link_to 'test me', new_book_path(color: 'blue'), remote: true %>

然后我在app / views / books / new.js.coffee有一个文件,≈以下代码:

test = ->
  'this is a test'

console.log test()
console.log( "<%= params[:color] %>" )

我明白了:

'this is a test'
'blue'

在我的浏览器控制台中。

答案 3 :(得分:1)

如果你不想安装coffeebeans,那么通过黑客入侵erb输出器有一种快速而肮脏的方式:

<% 
require 'coffee-script'; 
def coffee_script; CoffeeScript.compile yield '' end %>
<script type="text/javascript">
<% compiled = coffee_script do |_erbout|%>
->
  console.log 'works! this part is coffeescript!'
<% end %>
<% _erbout.concat compiled %>
</script>