将HTML返回给AJAX Rails调用

nic*_*hvi 7 javascript ajax ruby-on-rails coffeescript ruby-on-rails-4

在阅读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: '<partial-name>', layout: false if request.xhr?.这只是返回partial的HTML,并评估ruby代码.

3)在资产javascript文件(例如<partial-name>.js.coffee)中,监听ajax:success并附加响应中的HTML.

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

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

谢谢 :-)

小智 1

如果您使用remote: true,它会发送js请求而不是html请求。

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

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

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