RailsConf 上的 jQuery 会议
我很高兴地宣布,我关于“jQuery on Rails”的Birds of a Feather 会议提案已在RailsConf 上被接受!
如果您参加 RailsConf,请在周四晚上 9:30 前来 C125 室,加入讨论。我将分享我关于 jQuery on Rails 的持续工作,如果有人感兴趣,我还会演示一些代码。
如果您有兴趣了解其他人如何解决 jQuery 与 Rails 集成的相关问题,或者只是想分享您所做的酷炫事情,请随时过来。在那里见!
更多详情
Yehuda 刚刚在他的博客 上发布了更多关于jQuery on Rails 的工作原理 的信息。
自从我上次公开讨论 jQuery on Rails 以来,我已经尝试了许多方法,写了很多代码,并得出了一些结论。
- jQuery 和 非侵入式 JavaScript 本质上与尝试在标记中描述行为的方式不兼容,就像 Rails 通过“JavaScript 助手”所做的那样。
- 解决这个问题的尝试,特别是 Rails 的 UJS,仍然要求您将 JS 行为包含在视图中,然后这些行为会动态地合并到 JavaScript 文件中(并根据需要进行缓存)。如果您想在多个页面中包含相同的 JS 行为,则需要创建自定义助手并调用它们。
- jQuery 本身就是一个完美的非侵入式 JavaScript 机制,它已经内置于库中。
- jQuery 开发者面临的最大问题不是简单性(这在库中是免费的),而是难以在需要它们的 Rails 视图中包含正确的 jQuery“模块”。
在中等或更高复杂度的应用程序中,使用 jQuery 与 Rails 最常见的问题是在将所有内容包含在一个 application.js 文件中(这会导致大型应用程序严重变慢)和拥有多个模块化文件(在需要时正确包含这些文件非常麻烦)之间的权衡。
这对想要更多地使用 Rails 的 jQuery 用户来说是一个问题,而不是习惯于 Prototype 助手并想要将 jQuery 库用作直接替换的 Rails 用户。在 jQuery on Rails 的第一个版本中,我将针对想要使用 Rails 的 jQuery 开发者。换句话说,如果您熟悉 jQuery 或愿意使用 jQuery,那么 jQuery on Rails 适合您。
如果您不想学习 jQuery,并且想完全用 Ruby 进行编程,那么这个版本的 jQuery 不适合您。未来版本将包含一些针对纯 Ruby 开发者的功能,但我仍然认为非侵入式 JavaScript 与这种思维方式本质上是不兼容的。
综上所述,jQuery on Rails 到底做了什么?
首先,它是一个 Rails 插件,您可以通过在 application.rhtml 中添加 <%= include_jquery %> 来激活它。当您的服务器启动时,它将解析所有 JavaScript 文件,并识别这些文件中的选择器。当在布局中调用 include_jquery 时,它将获取渲染后的 HTML,并使用 Hpricot(与 jQuery 共享语法)来确定服务器启动时识别的任何选择器实例是否存在。
包含在 HTML 中的选择器的 JavaScript 文件将被加载并按预期运行。
简而言之
- 创建您的 JavaScript 文件,按惯例使用选择器
- 在布局中使用 include_jquery
- 您已完成
我在等待下一个版本的 jQuery,然后才实施……所以请原谅重复的问题。但是……久违的升级什么时候会到来?(我非常有兴趣使用“界面”,但它在三个堆叠列的示例中无法在 IE 中正确执行拖放。因为我的目标是使用它创建一个门户网站,所以这非常重要。它在 FF 甚至在我使用 Apollo beta 1 编写的浏览器中都能正常工作。它在 MS IE 中却坏了,真让人想不通。也许他们无力构建一个能正常工作的版本。无论如何……只是希望它能尽快到来。)
希望这次会议能进展顺利 - 我不会去,但我对您和其他人所发现的内容很感兴趣。我在我的博客上发布了我自己的学习经验:http://mad.ly/2007/05/17/jquery-ajax-rails/
我不知道其他人是否发现了这一点 - 您可以通过元素代理及其 method_missing 功能,直接使用开箱即用的 RJS 来渲染 JQuery Javascript。示例
page["#posts"].append render(:partial => ‘post’, :locals => {:post => @post})
#=> $("#posts").append("Post #29 info…");
page["#hide-this"].hide
#=> $(’#hide-this’).hide();
page["#foo"].html("bar").append("baz")
#=> $("#foo").html("bar").append("baz");
page["h1"].add_class "make-red"
#=> $("h1").addClass("make-red");
@geoff: 我不喜欢使用 RJS,因为它只是返回一大块 JS 代码,在客户端进行评估,这会将您与页面上下文分离。回调保留页面上下文(使您可以访问各种有用的信息),并且会生成更短、更紧凑、更易于维护的代码。
jQuery on Rails 侧重于让您保持 jQuery 代码模块化,同时让您将单个文件推送到客户端,并利用缓存进行相应的优化。我将在 RailsConf 上演示的实际上是一个概念证明;在(大规模?小规模?)发布之前,我会在未来几天添加更好的缓存选项和打包功能。
重申一下,此版本将针对想要更轻松地将 Rails 和 jQuery 结合使用的 jQuery 开发者。它不会提供“助手”或允许您完全用 Ruby 进行编码并忘记 JS。如果您不想编写任何 JavaScript,我并不认为 jQuery 适合您。
同意,返回一大块 Javascript 代码并在客户端进行评估有点混乱;我很乐意采用更简洁的方法。
JQuery on Rails 听起来很有前景 - 很期待看到它!
请原谅我的无知,但将应用程序与客户端紧密绑定有什么好处?自从 XHR 广泛被接受以来,我所做的所有工作都朝着相反的方向发展。如果有一个通用的数据交换(xml 或 json),那么应用程序技术和显示技术的选取就可以独立进行。我一直认为这是一件好事。
我错过了什么?
-wade
@wade: 我描述的方法,从服务器端的角度来看,是将客户端与服务器解耦。Rails 的方式是从服务器发送客户端代码回客户端。jQuery 的方式是发送 JSON 数据。
jQuery 只不过为发送回来的 JSON 数据提供了一个客户端实现。