读完 David Heinemeier Hansson 的 blog post关于服务器生成的 javascript 我决定回顾一下我在 Rails 应用程序中进行 AJAX 调用的方法。大卫的建议是创建一个 .js.erb
模板,它只是嵌入了在服务器上生成的 ruby 代码的 javascript,而不是在客户端 javascript 中进行任何 DOM 操作。
当然,另一种方法是在客户端简单地执行所有操作,并且(例如)从服务器返回一个表示更新对象的 JSON 对象,并使用 javascript 执行所有 DOM 操作。
我不喜欢第一种方法有两个原因:
1) 我在我的应用程序中使用 HAML 和 Coffeescript,并且觉得通过使用 vanilla javascript 和 ERB 会用不同语言的代码不必要地膨胀我的代码库(也许可以创建 .coffee.haml 模板而不是 js .erb,我不知道)
正如 David 在他的博客文章中所说,第二种方法非常依赖客户端 javascript,这可能导致客户端 javascript 代码臃肿,并且可能需要客户端模板,在最坏的情况下场景可能意味着模板数量几乎翻倍。
我决定采用的方法(并想问一下这是否是完全愚蠢的方法)如下:
1) 设置 remote: true
标记使链接和表单利用 AJAX 发布到服务器。
2) 在我的 Controller 中,将所有内容都作为 html 处理,如果请求是 AJAX 请求,则无需布局即可简单呈现:render partial: '<partial-name>', layout: false if request.xhr?
.这只是返回部分的 HTML,并评估了 ruby 代码。
3) 在 Assets javascript 文件中(例如 <partial-name>.js.coffee
)收听 ajax:success
并附加响应中的 HTML。
我喜欢这种方法,因为(在我相当简单的应用程序中)它允许我将所有代码保存在 HAML/Coffeescript 中,并避免使用任何 javascript 模板。
我意识到如果应用程序的复杂性增加,这个问题可能会呈现出不同的特征,但我仍然认为这是一个有效的问题:这是为 Rails 应用程序实现基于 AJAX 的架构的糟糕方法吗(如果是,为什么?即为什么从 AJAX 调用返回 HTML 而不是 JSON 是一个坏主意?)或者这是我应该继续使用的东西吗?
谢谢 :-)
最佳答案
在我看来,您的方法非常准确。但是我会改变 1 pt。我不使用 remote: true,而是直接使用 jQuery ajax 调用。
$(function(){
$('#some_link').click(function() {
$.ajax({
// some parameters here
})
.done(function(data){
$('div').html(data);
});
});
});
关于javascript - 将 HTML 返回给 AJAX Rails 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21043068/