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

What is a good way of implementing per-page JavaScript in Rails?

本文关键字:方法 是什么 JavaScript Rails 实现      更新时间:2023-09-26

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

在最后惰性加载页面特定的js文件是一个好方法吗?如:

<script>
$(document).ready(function() {
  $.getScript("/javascripts/this_pages_scripts.js");
});
</script>

有统一的方法来做这件事吗?我知道新的。js.erb等文件和ujs,但我仍然在谈论更多的页面特定的js -你知道,拖放初始化器,对话框创建器等。

我有两种方法:

对于那些只是添加一点视觉效果的小而琐碎的脚本,我通常将它们内联地包含在它们所修改的模板中(就像您所展示的那样),因为这样对我来说更容易跟踪。

对于任何超过一两行的东西,我保持它不引人注目,但使用content_for

加载它

我的应用程序布局看起来像这样(在HAML中):

= javascript_include_tag 'jquery.144.min','rails','jquery.tools','application'
= yield :scripts

重要的部分是yield :scripts。然后在我需要一些javascript的页面,我做:

- content_for :scripts do
  = javascript_include_tag 'photo_form'

这只在显示给定模板的情况下加载头文件中的javascript。content_foryield方法发送具有相应名称的内容。

您可以在任何地方粘贴像这样的yield块—我在结束正文标记之前也有一个。Yield/content_for非常方便。

注意,正如tadman在评论中指出的,任何不需要加载在页面头部的内容都应该加载在页面末尾

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

在我的应用程序布局中,我调用一个局部来呈现菜单,菜单代码看起来像:

#menubar (normal menu stuff)
  - if @special_menu
    #special_menu

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

- @special_menu = true

…对于该页面,将出现给定的菜单。你也可以在控制器操作中这样做,我有一个控制器,我在其中添加了一个before过滤器,将其中一个菜单标志设置为true。你可以对任何复杂的javascript内容做同样的事情,你可能想要有条件地包含。

这些想法大多是我从看这个铁路广播中得到的:http://railscasts.com/episodes/30-pretty-page-title

你应该看看!

设置一个符号来表示头文件中的文件名,并在控制器

中调用它
@script = "prototype"

然后在视图中:

<%= javascript_include_tag @script %>

或加载多个

@scripts = ["prototype", "dropdown"]
然后

<% @scripts.each do |s| %>
  <%= javascript_include_tag s %>
<% end &>

我个人使用requireJS和一个自定义的特征检测库来处理这个问题。

然后我有一个单行包括requires脚本和它的data-main属性在我的布局/主/共享视图页面。(我不熟悉rails这样,但它是相同的任何其他MVC)。

我在别的地方写了一个很好的答案。你也许能找到它