我可以在 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 文件之间执行展开转场(不使用情节提要)
Render.js 文件(电子应用程序)中的“未捕获的 TypeError:React.createClass 不是函数”