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

jco*_*lum 25 ruby-on-rails coffeescript ruby-on-rails-3

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

相关:在Rails 3应用程序中添加页面特定javascript的最佳方法?

我正在编写一个应用程序,并使用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]%>.

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

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

更新:看起来我可能有一个答案:

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

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

zee*_*raw 22

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

application.html.haml:

%body{ :data => { :controller => params[:controller], :action => params[:action]} }
Run Code Online (Sandbox Code Playgroud)

中高音.application.html.erb

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

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"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

边注:

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

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


Tre*_*ham 10

您可能只想使用以页面标记为条件的逻辑,而不是仅将文件包含在一个页面上.请参阅我对相关问题的回答.这样,您的用户就不必<script>为特定页面发出额外请求.

如果有很多特定于该页面的逻辑(例如,10K +缩小),则是,将其拆分.当你在编辑你的问题建议:而不是做require_tree .你的根javascripts目录下,而不是创建一个名为的子目录global和改变的顶部application.js

require_tree .
Run Code Online (Sandbox Code Playgroud)

require_tree global
Run Code Online (Sandbox Code Playgroud)

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