【问题标题】:Cannot render coffeescript partial inside coffeescript无法在咖啡脚本中呈现咖啡脚本部分
【发布时间】:2012-09-14 06:38:51
【问题描述】:

我想制作一个可以在页面加载后调用的通用控制器(使用 AJAX),并根据调用它的控制器更新页面上的不同内容。

目的是允许更好的页面和片段缓存,同时为用户显示自定义元素。

我的框架如下所示:

controllers/general_ajax_controller.rb
views/general_ajax/on_page_load.js.coffee
                 ./_update_some_stuff.js.coffee

控制器中的on_page_load 操作处理确定要加载哪些部分的逻辑,并且视图将呈现部分。

on_page_load.js.coffee 视图中,我有以下代码(简化):

<%= render "update_some_stuff" %>

应该呈现部分。相反,我得到了这个错误:

  ActionView::Template::Error (SyntaxError: Reserved word "function" on line 2):
  app/views/general_ajax/on_page_load.js.coffee:1:in `_app_views_general_ajax_on_page_load_js_coffee___2304196970850216490_70321203283120'

我认为coffeescript在包含在视图中之前是编译好的(这是coffee,不支持编译好的js)

如果我将on_page_load 视图的扩展名更改为.js.erb,那么它可以工作。 (奇怪的是,我必须在它工作之前重新启动我的服务器,你知道为什么吗?)

您认为这是coffeescript 中的一个问题,还是不好的做法,因此不受支持?

作为一个附带讨论,您如何看待我处理动态脚本的方法?

【问题讨论】:

    标签: ruby-on-rails-3.1 rendering coffeescript partials


    【解决方案1】:

    一种解决方案是将原始解析的 javascript 嵌入到视图中。

    注意后面的勾号(告诉 coffeescript 这是原始的 javascript)和使用 raw() 来撤消渲染部分的 HTML 转义。

    `
    <%= raw(render("update_some_stuff")) %>
    `
    

    【讨论】:

      【解决方案2】:

      这是因为 _update_some_stuff.js.coffee 被解释并转换为 Javascript。当它被插入 on_page_load.js.coffee 时,它会引发错误,因为 vanilla Javascript 代码在 Coffee-Script 文件中不兼容(在这种情况下是 function 关键字)。

      【讨论】:

      • 是的,我同意,这就是导致问题的原因。但是你推荐什么而不是render "update_some_stuff"?如何正确使用coffeeScript partials?
      • 我不知道。我还不需要这个。我已经使用 respond_to 来呈现 javascript。也许从那里你可以根据某种条件渲染一个或另一个文件,并使用 Rails 部分。
      • 我的想法是分离文件,这样每个文件都有自己的功能,并且可以单独加载它们,具体取决于它们是否需要(某种延迟加载)。有时需要一次加载更多文件,因此渲染调用在这里不起作用。
      • 我有时也遇到过类似的情况,我和你一样感到停滞不前。我认为,如果那不可能做到,那一定是因为这不是做到这一点的方法。停下来想想另一种方法来完成你所需要的。考虑到每个 Rails 请求都可以用 javascript 响应,并且 javascript 会自动执行。