这篇文章中有几个问题都与标题有关.该帖子的总体主题可以概括为"我缺少什么/你如何更好地做到这一点?"
通过谷歌搜索/截屏/ API的常用方法,我刚刚学习了如何使用Rails 3.0-JQuery-Ajax组合的初学知识.
我留下了一些(可能是相当大的?)问题.在Railscast 242中,Ryan最终通过以下方式执行页面的最终更新:
$("#products").html("<%= escape_javascript(render("products")) %>");
Run Code Online (Sandbox Code Playgroud)
起初,这看起来很奇怪,而且看起来有点奇怪:index.js.erb模板知道index.html页面有一个'#products'div,而index.js.erb模板本身就是这样的发出更新命令?在我看来,这似乎是对Separation of Concerns的轻微违反 - 不应该在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))%>");
Run Code Online (Sandbox Code Playgroud)
现在我的创建操作也知道我的索引页面是什么样的.嗯......现在假设我们也想做一个相对标准的行为,即通过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))%>");
Run Code Online (Sandbox Code Playgroud)
现在,除了在我看来索引和创建之间的耦合比我更接近之外,我在我的js模板中有这个大胖子更新.我不知道如何将其抽象出来 - 我可以将其包装成一个方法吗?我把它放在哪里?即使它可以被包装到一个方法中,每个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 %> …Run Code Online (Sandbox Code Playgroud)