Rails 最佳实践:在哪里放置不显眼的 JavaScript

rails best practices where to place unobtrusive javascript

提问人:nathanvda 提问时间:5/23/2010 最后编辑:Sam Saffronnathanvda 更新时间:9/30/2014 访问量:3151

问:

我的 Rails 应用程序(所有 2.3.5)完全混合使用了内联 JavaScript、RJS、prototype 和 jQuery。我们称之为学习或成长的烦恼。最近,我越来越迷恋不显眼的javascript。它使你的html变得干净,就像css清理它一样。

但是我看到的大多数例子都是小例子,他们把所有的javascript(jquery)都放在application.js中

现在我有一个相当大的应用程序,我正在考虑构建我的 js 的方法。我喜欢我的脚本仍然接近视图,所以我在想类似

orders.html.erb
orders.js

其中 orders.js 包含特定于该视图的不显眼的 JavaScript。但也许这只是我太保守了:)

在这里和这里阅读了耶胡达·卡茨(Yehuda Katz)关于这个问题的一些帖子,他在那里解决了这个问题。它将遍历你的js文件,只加载那些与你的视图相关的文件。但是,唉,我找不到当前的实现。

所以我的问题:

  • 你如何最好地构建你的不显眼的 JavaScript;管理你的代码,你如何确保从HTML中可以清楚地看出某些东西应该做什么。我想好的班级名称有很长的路要走:)
  • 你如何安排你的文件,把它们全部加载进去?就几个?您是否使用 或 在您的视图中加载相关脚本。或。。。?content_for :scriptjavascript_include_tag
  • 你是编写非常通用的函数(如删除),带有参数(添加额外的属性?),还是编写非常具体的函数(DRY?)。我知道在 Rails 3 中有一个标准集,那里的一切都不显眼。但是如何在 Rails 2.3.5 中开始呢?

简而言之:在 Rails 中执行不显眼的 javascript 的最佳实践是什么?:)

javascript jquery ruby-on-rails ruby unobtrusive-javascript

评论


答:

10赞 Sam Saffron 5/23/2010 #1

我不认为有一种最佳实践,但我会让你知道我是做什么的。

  1. 我有一系列的js文件,每个文件在目录中都有自己的用途。一些例子可以是等等。public/javascripts/utility.jschat.jsshopping_basket.js

  2. 我使用资产打包器,并为我的所有通用功能定义了一个大型脂肪集合,并为仅管理员功能定义了另一个。往返服务器的成本太高了。我基本上将所有 js 都包含在第一页加载中,缩小到一个 blob 中(一般来说)

  3. 我允许在页面中内联基本钩子,并保持它们非常短。$(document).ready

  4. 我的 js 文件需要访问的数据与页面内联呈现。(通常在 DOM 中,有时作为 vars - 例如。var xyz = 100)

  5. 我通常会在关闭 javascript 的情况下开发我的控制器(并确保一切正常),然后我打开它并在需要时撒上一些。if request.xhr?


请记住,Rail 3.1 引入了内置的最佳实践,请参阅: http://guides.rubyonrails.org/asset_pipeline.html - 就我个人而言,我在使用新管道时遇到了性能和配置问题,但许多其他人都取得了巨大的成功。

评论

0赞 nathanvda 5/30/2010
这很有趣。完成。我仍然对其他人要说的话感兴趣。
3赞 Toby Hede 5/29/2010 #2

我最近记录了我如何在 Ruby on Rails 中管理 javascript。我基本上将内容分解为许多小的、细粒度的文件,每个文件都有一个适当的命名空间,然后将它们全部合并到一个文件中,以便使用 asset_packager 进行生产。

评论

0赞 nathanvda 5/30/2010
我喜欢如何自动加载与视图控制器同名的 .js 文件。这似乎是一个好的开始,至少:)
1赞 jxpx777 10/18/2010 #3

我在尝试解决同一问题时发现了这篇文章,但现有的解决方案都没有让我觉得是正确的。我在这里写下了我的方法我喜欢 Rails 的配置约定,所以我想要相同的方法来包含仅适用于特定操作页面的 Javascript。如果不出意外,这至少是添加到您的选择中的另一种方法。

评论

0赞 nathanvda 10/19/2010
我真的很喜欢你的建议,它非常接近我真正想要的。无论如何,我现在要做的是将每个控制器文件中的 js 分开,但随后放入一个大的组合 js,因为它加载速度更快(1 个大 js 而不是大量单独的文件)。