将HTML返回给AJAX Rails调用

在阅读David Heinemeier Hansson关于服务器生成的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。

正如大卫在他的博客文章中谈到的那样,第二种方法非常依赖于客户端javascript,这可能导致客户端javascript代码膨胀,并且可能需要客户端模板,这在最坏的情况下可能意味着几乎是模板数量的两倍。

我决定采用的方法(并且想要询问是否完全是愚蠢的方式)如下:

1)设置remote: true标志,使链接和表单利用AJAX发布到服务器。

2)在我的控制器中,处理所有内容为html,如果请求是AJAX请求,则只需渲染而不进行布局: render partial: '', layout: false if request.xhr? 。 这只是返回partial的HTML,并评估ruby代码。

3)在资产javascript文件中(例如.js.coffee ),听取ajax:success并从响应中追加HTML。

我喜欢这种方法,因为(在我相当简单的应用程序中)这允许我将所有代码保存在HAML / Coffeescript中,并避免使用任何javascript模板。

我意识到如果应用程序的复杂性增加,这个问题可能会有不同的特性,但我仍然觉得这是一个有效的问题:这是一个不好的方法来为Rails应用程序实现基于AJAX的架构(如果是这样的话) ,为什么?即有什么理由为什么从AJAX调用返回HTML而不是JSON是一个坏主意?)或者这是我应该继续使用的东西?

谢谢 :-)

你的方法在我看来非常准确。 但是我会换1点。 而不是使用remote:true,我会直接使用jQuery ajax调用。

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

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

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

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

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