Rails 3.0 / 3.1,JQuery和Ajax最佳实践

问题描述

|| 在这文章中,有几个问题都与标题有关。该帖子的总体主题可以总结为:“我想念的是什么/您如何做得更好?” 通过谷歌搜索/截屏/ API的常用方法,我刚刚学习了有关如何使用Rails 3.0-JQuery-Ajax组合的入门知识。 我剩下一些(可能是相当大的?)问题。在Railscast 242中,Ryan通过执行以下操作最终完成了对该页面的最终更新:
$(\"#products\").html(\"<%= escape_javascript(render(\"products\")) %>\");
最初,这似乎超级奇怪,但似乎仍然有些奇怪:index.js.erb模板知道index.html页面具有\'#products \'div,而index.js.erb模板本身更新命令是什么问题?在我看来,这有点违反关注点分离-index.html页面上的JS不应使用从帖子中返回的数据实际更新页面,而不是从脚本中获取的数据。服务器是什么实际上更新页面?另外,这似乎有点脆。出于任何愚蠢的原因,如果我将index.html上的div重命名为\'#products_collection \',而忘记更改index.js.erb,那么我的index.html页面仍然可以使用,但是我的Ajax更新成功了\没错我想知道您是否认为以上几点是正确的,如果是,该怎么做。 如果需要的话,我可以解释一下这些事情:如果将整个索引操作考虑在内,那么index.js知道index.html并不重要。它们可能紧密耦合,但是它们应该/可以。您进行的任何测试都会发现div重命名。精细。但... 现在,我想到了进一步深入Ajax兔子漏洞的想法:假设您通过Ajax get将新表单加载到索引页面中,然后通过Ajax发布提交它。按照相同的模式,您的create.js.erb文件可能看起来像这样: create.js.erb?
$(\"#products\").prepend(\"<%=escape_javascript( render \'product_as_table_row\',:product => @product))%>\");
现在,我的create动作也知道索引页的外观。嗯...现在假设我们还希望通过Flash向用户提供消息的相对标准行为: create.js.erb?
<% flash.each do |key,value| %>
  $(\"div#flash\").html(\"<div class=\'<%=key%>\'><%=value%></div>\");
<% end %>
$(\'div#flash div\').fadeOut(10000);

$(\"#products\").prepend(\"<%=escape_javascript( render \'product_as_table_row\',:product => @product))%>\");
现在,除了在我看来索引和创建之间比我更接近的耦合之外,我的js模板中还有一个很大的Flash更新。我看不到如何将其抽象化- 我可以把它包装成一个方法吗?我放在哪里?即使可以将其包装为一个方法,不是每个create.js和update.js模板都需要调用函数,并且不是非DRY吗?这是3.1中的视图继承的目的是什么?您是否认为Ajax不需要使用Flash,因为用户现在可以在页面上看到他的产品? 创作失败怎么办?这是否也被扔到create.js.erb中? create.js.erb
<% if @thought.new_record? %>
  <%# ??? Throw in Validation-Error Form Updates? display a Modal Dialog? %>
<% else %>
  $(\"#products\").prepend(\"<%=escape_javascript( render \'product_as_table_row\',:product => @product))%>\");
<% end %>
简而言之,我已经学习了如何执行获取和发布请求,但是我没有看到如何在整个应用程序中正确,正确地或完全地将整个Ajax模式应用于整个资源。我遇到的事情似乎可以解决微小的问题,但总的来说不是。抽象的JS也许抽象的很好,但是目前看来,它对我的​​许多应用程序来说都非常具有吸引力。从未在Rails 2.x中完成过Ajax,但我没有任何基础。所以..在我看来,所有这些看似草率的行为都不可能是The Rails的做事方式。我想念什么?任何和所有见解表示赞赏。     

解决方法

        我强烈建议您阅读rails_ujs团队的核心成员之一的以下文章,包括底部的所有参考:rails-2-remote-links-and-forms     ,        您可以将所有这些包装在函数中,并将它们放置在application.js中,以便您的模板看起来像
update_product(\"<%= escape_javascript(render(\"products\")) %>\");

add_product(\"<%=escape_javascript(render \'product_as_table_row\',:product => @product))%>\");

etc..
更新闪存和错误处理也是如此