ruby​​无法在.js.coffee中使用coffeescript来实现ajax响应

问题描述:

我正在使用Rails 3.1,似乎我无法在为我的create_error.js.coffee视图文件中的CoffeeScript语句使用AJAX响应后使用Ruby脚本。ruby​​无法在.js.coffee中使用coffeescript来实现ajax响应

如果我不喜欢这样它会工作:

<% if @attached_image.errors.any? %> 
    alert 'something is wrong' 
<% end %> 

但如果是像下面,用CoffeeScript的发言后<% %>

errors_block = '<div id="errors_block"></div>' 
<% if @attached_image.errors.any? %> 
    something.. 
<% end %> 

我总是支持得到一个异常的if行上的ActionView::Template::Error (Parse error on line 6: Unexpected 'INDENT')。我已经尝试了几个样本,每次发生在coffeescript语句后出现红宝石<% %>时。

这是为什么?

听起来就像您在ERB后CoffeeScript中遇到缩进问题。鉴于这种:

errors_block = '<div id="errors_block"></div>' 
<% if @attached_image.errors.any? %> 
    something... 
<% end %> 

输出看起来像这样当if条件为真:

errors_block = '<div id="errors_block"></div>' 

    something... 

和缩进开始一个新块没有意义在这方面;因此CoffeeScript编译器出现“Unexpected'INDENT'”错误。您可以在this snippet on coffeescript.org中看到此操作。

CoffeeScript对缩进非常敏感,因此混合ERB和CoffeeScript并不是一个好主意。你会更好把@attached_image.errors到CoffeeScript的变量,然后做逻辑的CoffeeScript,更多的东西像这样(未测试的代码):

errors = <%= @attached_image.errors.to_a.to_json.html_safe %> 
errors_block = '<div id="errors_block"></div>' 
if errors.length > 0 
    something... 

错误数组的JSON版本应该是有效的CoffeeScript所以errors会成为一个CoffeeScript数组。 to_aerrors返回nil,我不知道如果errors.nil?是可能的,但我不知道我的头顶,但一点额外的偏执狂从未伤害任何人。

你也可以这样做:

errors_block = '<div id="errors_block"></div>' 
<% if @attached_image.errors.any? %> 
something.. 
<% end %> 

但这是难以阅读,你会忘记。您最好使用ERB生成CoffeeScript数据并让CoffeeScript处理逻辑。

+0

您的回答非常完美! – larryzhao 2012-02-04 05:23:57

+0

嗨,我尝试使用'error_msgs = '但我得到了'ActionView :: Template :: Error(保留字“var”在第1行)''。有什么我再次做错了吗? – larryzhao 2012-02-04 14:40:36

+0

尝试添加'html_safe'以防止对引号进行编码,请参阅我的更新。 – 2012-02-04 18:18:23

你的文件应该被称为:

create_error.js.coffee.erb 

所以,你可以在上面添加红宝石。

+0

昨天我发现这个https://github.com/rails/coffee-rails/issues/13,它告诉我使用js.coffee(没有erb部分),它实际上工作得很好,使用ruby代码部分,只有在咖啡陈述之后有''这个咖啡处理器才会通过。但它可以在其他方面或其他方面起作用。我将编辑这个问题以使其更清楚。 – larryzhao 2012-02-02 14:54:24