2011-06-03 82 views
12

我需要做什么才能在Rails JS视图中使用CoffeeScript?例如:我可以在render.js上执行的视图中使用CoffeeScript吗?

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

我需要做什么才能让Rails使用index.js.coffee

+0

如果你只需要添加.coffee extention? (如果您使用的是Rails 3.1) – bor1s 2011-06-03 09:44:17

+0

我做过了,但它似乎不起作用。 – Geo 2011-06-03 10:21:06

+0

你使用什么Rails版本? – bor1s 2011-06-03 10:27:46

回答

13

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


更新:现在支持在轨3.2

+6

你一定是在跟我开玩笑! – 2011-06-03 12:57:47

+0

它在3.2中支持 – Artur79 2013-02-27 10:33:34

+0

更新,谢谢。 – David 2013-02-27 22:06:39

15

约翰尼的答案是正确的。如果你看一下挂在CoffeeBeanspull request,你有DHH说

一旦我们有一个快速,简洁的实现,这是核心的欢迎。不过,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 。

+0

非常感谢。我今天刚刚面对这个问题,并注意到Rails中如何处理这个问题。在我的情况下,我将把我的coffeescript for javascript-requests翻译成纯JS,直到Rails支持它。 – 2012-11-17 19:01:39

+0

您正在展示我们在视图中可以做的事情,但问题不在于他在询问如何执行内部控制器或者在Ruby文件中? – uday 2013-11-07 21:48:59

10

这现在在Rails 3.2中工作。例如,我有一个名为book的资源。此资源在应用程序/视图/书籍/ index.html.erb与文件以下内容:

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

然后,我必须在应用程序/视图/书籍/ new.js.coffee文件在≈具有以下代码:

test = -> 
    'this is a test' 

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

我看到:

'this is a test' 
'blue' 
在我的浏览器控制台

+1

这已确认。我只是用它与Rails 3.2.3没有问题。 – stebooks 2012-05-23 22:51:19

+2

你有没有得到这个生产工作?视图上的.coffee扩展在开发模式下工作,但在生产模式下失败。我正在使用Rails 3.2.3 – 2012-10-20 16:57:03

1

如果你不想安装coffeebeans,继承人排序的快速和肮脏的方式通过黑客进入该局输出器有点做到这一点:

<% 
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> 
相关问题