读完大卫·海涅迈尔·汉森之后博客文章 https://37signals.com/svn/posts/3697-server-generated-javascript-responses关于服务器生成的 javascript 我决定回顾一下在 Rails 应用程序中进行 AJAX 调用的方法。大卫的建议是创建一个.js.erb
template,它只是嵌入了服务器上生成的 ruby 代码的 javascript,而不是在客户端 javascript 中进行任何 DOM 操作。
另一种方法当然是简单地在客户端完成所有操作,并且(例如)从服务器返回表示更新后的对象的 JSON 对象,并使用 javascript 执行所有 DOM 操作。
我不喜欢第一种方法,原因有二:
1)我在我的应用程序中使用HAML和Coffeescript,并且感觉通过使用vanilla javascript和ERB会用不同语言的代码不必要地使我的代码库膨胀(也许可以创建.coffee.haml模板而不是js.erb,我不知道)
2)我真的不喜欢在我的视图文件夹中“乱扔”一些本质上是javascript文件的想法,并嵌入了一点ruby。
正如 David 在他的博客文章中谈到的,第二种方法非常依赖客户端 javascript,这可能会导致客户端 javascript 代码臃肿,并且可能需要客户端模板,这在最坏的情况下可能意味着模板数量几乎翻倍。
我决定采用的方法(并想问这是否是完全愚蠢的方法)如下:
1) 设置remote: true
标记使链接和表单利用 AJAX 发布到服务器。
2) 在我的控制器中,如果请求是 AJAX 请求,则将所有内容处理为 html,并且无需布局即可简单渲染:render partial: '<partial-name>', layout: false if request.xhr?
。这只是返回部分的 HTML,并评估 ruby 代码。
3) 在资产 javascript 文件中(例如<partial-name>.js.coffee
)听ajax:success
并附加响应中的 HTML。
我喜欢这种方法,因为(在我相当简单的应用程序中)这允许我将所有代码保留在 HAML/Coffeescript 中,并避免任何 JavaScript 模板。
我意识到,如果应用程序的复杂性增加,这个问题可能会呈现出不同的特征,但我仍然认为这是一个有效的问题:这是为 Rails 应用程序实现基于 AJAX 的架构的糟糕方法吗(如果是的话) ,为什么?也就是说,为什么从 AJAX 调用返回 HTML 而不是 JSON 是一个坏主意?)或者这是我应该继续使用的东西吗?
谢谢 :-)