我应该如何在一个页面上包含coffeescript文件?

时间:2011-11-27 06:54:25

标签: ruby-on-rails ruby-on-rails-3 coffeescript

编辑:一年后,如果我要再次这样做,我会用curl.js代替Rails资产管道。

相关:Best way to add page specific javascript in a Rails 3 app?

我正在编写应用程序并使用coffeescript生成所有js。这就是相关问题不能满足我需要的原因。

我希望能够将coffeescript文件放在我的资源目录的子文件夹中,并将该.coffee文件仅在一个页面上提供。该页面位于命名路径

match 'myNotifications' => 'user#notifications'

最明显的事情是将.coffee文件放在assets\javascripts\user\index.js.coffee中。但在阅读有关资产的文档后,我不清楚。

我读了这一行(来自http://guides.rubyonrails.org/asset_pipeline.html):

  

您应该将任何JavaScript或CSS唯一添加到控制器内部   他们各自的资产文件,因为这些文件可以加载   对于具有<%= javascript_include_tag等行的控制器   params [:controller]%>或<%= stylesheet_link_tag params [:controller]   %GT;

好的很酷,所以我将页面特定的js放在assets\javascripts\user.js.coffee中。然后我重新加载了我的主页,按Ctrl F5。 user.js文件仍在主页上加载。经过$ -> alert 'ready from users controller'测试;加载主页时看到警报。

Rails是否有办法让每页的coffeescript文件只能与该页面一起提供?我读错了吗?在assets文件夹中是否有一个地方可以放入.coffee文件,它们不会被每个页面加载?

更新:我可能会have an answer

  

我们有几种方法可以解决这个问题。我们   可以使用require_directory而不是require_tree,因为这只会   加载当前目录中的文件而不是子目录中的文件。如果   我们希望更多地控制我们可以要求的包含文件   单独而不是包括整个目录。或者我们   可以移动我们想要包含在其中的JavaScript文件   页面到公共子目录。然后我们可以使用require_tree   ./public只包含那些文件。

我会在上午给出一个镜头。

2 个答案:

答案 0 :(得分:22)

这是我用来制作控制器/视图特定咖啡的方法:

application.html.haml:

%body{ :data => { :controller => params[:controller], :action => params[:action]} }

ALT。 application.html.erb

<%= content_tag(:body, :data => { :controller => params[:controller], :action => params[:action] }) do %>
  ...
<% end %>

application.js.coffee:

$(document).ready ->
  load_javascript($("body").data('controller'),$("body").data('action'))

load_javascript = (controller,action) ->
  $.event.trigger "#{controller}.load"
  $.event.trigger "#{action}_#{controller}.load"

users.js.coffee

$(document).bind 'edit_users.load', (e,obj) =>
  # fire on edit users controller action

$(document).bind 'show_users.load', (e,obj) =>
  # fire on show users controller action

$(document).bind 'users.load', (e,obj) =>
  # fire on all users controller actions

旁注:

这对PJAX很有用,你可以在PJAX请求上传递带有响应头的控制器/动作名称,然后根据它激发这些js函数。

编辑(2014/03/04): 使用 turbolinks.js 时,此解决方案仍然有效。

答案 1 :(得分:9)

您可能只想使用以页面标记为条件的逻辑,而不是仅将文件包含在一个页面上。见my answer to a related question。这样,您的用户就不必为特定页面发出额外的<script>请求。

如果有一个批次特定于该页面的逻辑(例如,10K +缩小),则是,将其拆分。正如您在编辑问题时所建议的那样:而不是在require_tree .目录的根目录下执行javascripts,而是创建一个名为global的子目录并更改{{1}的顶部来自

application.js

require_tree .

然后将特定于页面的CoffeeScript文件放在根require_tree global 目录中,并通过该页面模板中的javascripts调用指向该文件。