将 HTML 返回到 AJAX Rails 调用

Posted

技术标签:

【中文标题】将 HTML 返回到 AJAX Rails 调用【英文标题】:Returning HTML to AJAX Rails calls 【发布时间】:2014-01-29 08:27:35 【问题描述】:

在阅读了 David Heinemeier Hansson 的 blog post 关于服务器生成的 javascript 之后,我决定回顾一下我在 Rails 应用程序中进行 AJAX 调用的方法。 David 的建议是创建一个.js.erb 模板,它只是嵌入了服务器上生成的 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) 在我的控制器中,将所有内容都作为 html 处理,如果请求是 AJAX 请求,则只需在没有布局的情况下进行渲染: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 是一个坏主意?)或者这是我应该继续使用的东西吗?

谢谢你:-)

【问题讨论】:

【参考方案1】:

在我看来,您的方法相当准确。但是我会改变1 pt。我不会使用remote: true,而是直接使用jQuery ajax 调用。

$(function()
   $('#some_link').click(function() 
       $.ajax(
          // some parameters here
      )
      .done(function(data)
           $('div').html(data);
      );
   );
);

【讨论】:

【参考方案2】:

如果你使用 remote: true 它发送一个 js 请求而不是 html 请求。

然后当控制器方法被执行时,它会查找与刚刚执行完毕的控制器动作同名的 js.erb 或 js.haml 文件。

在此文件中,您可以编写“js”代码来执行控制器操作完成执行后需要执行的任何操作,例如更改部分视图或更新视图等。

如果您在 javascript 资产文件中有一个函数,您也可以调用该函数。

【讨论】:

以上是关于将 HTML 返回到 AJAX Rails 调用的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Ajax:返回值给调用者?

将 knockoutjs 视图模型传递给多个 ajax 调用

Rails 3 AJAX请求真实性令牌被忽略

Rails - 如何编写一个链接,该链接将被调用以在控制器中调用带有参数的操作?

如何使用 AJAX 请求将用户在类变量中的 HTML5 位置从 JavaScript 传递到 Rails 控制器?

渲染 ajax POST 调用以填充 DIV 的问题