在Rails中实现每页JavaScript的好方法是什么?

Dav*_*ave 9 javascript jquery ruby-on-rails

在Ruby中尝试新事物 - 在每个页面上我都在用jquery做很丰富的东西.显然,如果我把所有jquery都放到application.js中,它会很快变大.

在最后延迟加载特定于页面的js文件是一种好方法吗?例如:

<script>

$(document).ready(function() {

  $.getScript("/javascripts/this_pages_scripts.js");

});
</script>
Run Code Online (Sandbox Code Playgroud)

这样做有轨道方式吗?我知道new.js.erb等文件和ujs,但我仍然在谈论更多特定于页面的js - 你知道,拖放初始化器,对话框创建器等.

非常感谢你.

And*_*rew 12

我使用两种方法:

对于那些只是添加一点点眼花缭乱的微小,琐碎的脚本,我经常将它们内嵌在他们修改的模板中(就像你已经显示的那样),因为我更容易跟踪这种方式.

对于任何超过一两条小线的东西,我保持不引人注目,但加载它 content_for

我的应用程序布局如下所示(在HAML中):

= javascript_include_tag 'jquery.144.min','rails','jquery.tools','application'
= yield :scripts
Run Code Online (Sandbox Code Playgroud)

重要的是yield :scripts.然后在我需要一些javascript的页面中:

- content_for :scripts do
  = javascript_include_tag 'photo_form'
Run Code Online (Sandbox Code Playgroud)

这会在标头中加载javascript,但仅在显示给定模板时才会加载.使用相应的名称content_for将东西发送到yield方法.

你可以在任何地方粘贴一个yield块 - 我也有一个就在关闭body标签之前.Yield/content_for非常方便.

请注意,tadman在评论中指出,任何不必在头部加载的内容都应该在页面末尾加载.

最后要注意的是,如果你有更复杂的东西,你也可以在模板和应用程序视图之间使用实例变量.例如,我的应用程序中有一个菜单栏,它位于应用程序布局中.因此,有时我想仅在某些页面上触发特定于上下文的按钮或其他按钮行.

在我的应用程序布局中,我调用了一个部分呈现菜单,菜单代码如下所示:

#menubar (normal menu stuff)
  - if @special_menu
    #special_menu
Run Code Online (Sandbox Code Playgroud)

那么,在任何模板中你都可以做到:

- @special_menu = true
Run Code Online (Sandbox Code Playgroud)

...对于该页面,将显示给定的菜单.你也可以在控制器动作中执行此操作,我有一个控制器,我添加了一个前置过滤器,将其中一个菜单标志设置为true.对于您可能希望有条件地包含的任何复杂的javascript内容,您可以执行相同的操作.

我从看这个railscast获得的大部分想法:http: //railscasts.com/episodes/30-pretty-page-title

你应该看看!