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

Posted

技术标签:

【中文标题】我可以在 render.js 上执行的视图中使用 CoffeeScript 吗?【英文标题】:Can I use CoffeeScript in the views executed on render.js? 【发布时间】:2011-09-07 16:26:35 【问题描述】:

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

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

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

【问题讨论】:

如果只添加 .coffee 扩展名会怎样? (如果您使用的是 Rails 3.1) 我做了,但它似乎不起作用。 你使用什么 Rails 版本? 【参考方案1】:

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


更新:rails 3.2 现在支持它

【讨论】:

你在开玩笑吧!【参考方案2】:

约翰尼的回答是正确的。如果您查看从CoffeeBeans 页面链接到的pull 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手。

【讨论】:

非常感谢。我今天刚遇到这个问题,并注意到 Rails 是如何处理这个问题的。就我而言,我会将用于 javascript-requests 的咖啡脚本转换为纯 JS,直到 Rails 开箱即用地支持它。 您正在展示我们可以在视图中执行的操作,但问题不是他在问如何在控制器内部或 ruby​​ 文件中执行相同的操作吗?【参考方案3】:

现在可以在 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'

在我的浏览器控制台中。

【讨论】:

已确认。我只是将它与 Rails 3.2.3 一起使用,没有任何问题。 您是否已将其用于生产?视图上的 .coffee 扩展在开发模式下工作,但在生产模式下失败。我正在使用 Rails 3.2.3【参考方案4】:

如果你不想安装咖啡豆,这是一种快速而肮脏的方法,只需稍微侵入 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>

【讨论】:

以上是关于我可以在 render.js 上执行的视图中使用 CoffeeScript 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个 .xib 文件之间执行展开转场(不使用情节提要)

何时需要在视图上执行 invalidate()?

在 1 个数据库上授予视图

Render.js 文件(电子应用程序)中的“未捕获的 TypeError:React.createClass 不是函数”

在关闭视图控制器时执行功能

如何使用 UIGesture 将 UIImage 添加到应用程序中的大多数视图。