2011-12-11 65 views
5

这是默认application.js如何根据控制器/操作加载Javascript资源?

//= require jquery 
//= require jquery_ujs 
//= require_tree . 

的CoffeeScript模板有这样的内容: “相关配套控制器这里

# Place all the behaviors and hooks related to the matching controller here. 
# All this logic will automatically be available in application.js. 
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ 

对我来说,意味着foo_bar.js.coffee只应装当使用foo_bar控制器时。我对吗?

问题是它会加载所有Javascript文件,即使它们不是必需的。另外...我想知道如何有条件地包含JavaScript文件取决于控制器的行为。

回答

12

一对夫妇的方式做到这一点,最简单,最优雅的方式我发现是这样的:

取出

//= require_tree . 

指令,并改变你的TEMPL吃到

<%= javascript_include_tag "application", controller_name %> 

然后加载您的应用程序中的全局js和controller_name中特定的控制器。例如,如果你在posts_controller中,你将得到posts.js或posts.js.coffee的加载。

编辑

要执行的动作,你也可以添加

action_name 

我提出的解决方案。你可能会考虑的一件事是将其分解到application_controller中。RB:

before_filter :your_function 

def your_function 
    @controller = controller_name 
    @action = action_name 
end 

在布局然后使用它像这样

<%= javascript_include_tag "application", "#@controller.#@action" %> 
+1

+1我同意。这是一个很好的模块化解决方案 – lucapette

+2

很酷,这就是生成的骨架应该如何完成的。行动呢?我的意思是...我想只为特定的动作加载JavaScript ...是否也可以通过简单的方式进行操作? – Cristian

3

application.js中的require_tree指令加载资产树中找到的所有js和coffee文件。如果您删除它,它只会加载指定的文件。

对我来说,“与这里的匹配控制器相关”意思是foo_bar.js.coffee应该只在使用foo_bar控制器时加载。我对吗?

不,通过“require”指令载入文件。

另外...我想知道如何根据控制器的动作有条件地包含Javascript文件。

做一个foo_bar.js文件为每个控制器,在每个需要为所需的其他文件,并有条件地将它们包含在你的布局

# some_layout.erb 
<%= javascript_include_tag params[:controller] %>