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

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

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

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

它尚未在3.1中得到支持。 您将需要使用Coffeebeans 。


更新:现在支持rails 3.2

约翰尼的回答是正确的。 如果你查看从CoffeeBeans页面链接到的pull请求 ,你就会说

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

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

 <%= coffee_script_tag do %> alert "coffee script is #{verb}!" <% end %> 

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

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

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

这现在在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' 

在我的浏览器控制台中

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

 <% require 'coffee-script'; def coffee_script; CoffeeScript.compile yield '' end %>