好的,我试图了解HTML和XML格式的创建和更新方法的最佳实践。rails生成器生成的控制器的默认代码对我来说有点不清楚。
对于CREATE方法,给出了一个很好的保存条件,生成器对"redirect_to(@whatever)“说:呈现:xml => @ =>,:status => :created,:location =>@ and 。
如果保存得不好,生成器会对HTML使用“呈现:action => 'new'”,对XML使用“呈现:xml => @whatever.errors,:status => :unprocessable_entity”。
但是,对于update方法,如果有一个很好的更新,生成器会对"redirect_to(@whatever)“说HTML,而对说"head :ok”。
而且,如果更新错误,生成器会对HTML使用“呈现:操作=>‘编辑’”,而对于XML则使用“呈现:xml => @whatever.errors,:status => :unprocessable_entity”。
我明白这一点,这对我来说是有意义的,而且效果很好--但是,我有两个问题:
首先,对于成功的创建和更新,HTML格式,为什么"redirect_to(@whatever)“而不是”呈现:动作=>‘显示’‘?我理解重定向和渲染之间的区别,只是更好奇你们倾向于用哪种方式来做,以及为什么。对于浏览器来说,重定向似乎是不必要的额外旅行。
第二,为什么在通过XML成功更新时使用"head :ok“,而在通过XML成功创建时”呈现:xml => @,:status => :created,:location => @location“呢?这在我看来似乎不一致。似乎通过XML成功的更新应该与通过XML成功创建相同。似乎您需要返回新的/更新的对象,以便对其进行测试。你们是怎么做到的?为什么?
发布于 2010-09-03 08:41:09
当山姆C回答时,我已经把这个写出来了,但不管怎样,这里是:-)
对于第一部分-为什么重定向而不是渲染?我能想到的两个原因:
( 1)前后一致。如果您呈现了“显示”操作,并且用户稍后在返回到该页时使用“后退”按钮,则用户将看到意外的行为。有些版本的IE会给您提供某种会话超时错误IIRC,其他浏览器可能会更优雅地处理它。
如果用户将该页面标记为书签,并使用GET请求在稍后的日期返回该页面,则同样如此--他们将不会看到显示操作。您的应用程序可能会抛出一个错误,或者呈现索引操作,因为用户正在请求像http://my.app.com/users这样的URL,当使用GET请求时,该URL将映射到索引操作。
2)如果您呈现显示操作而不重定向到GET请求,并且用户点击刷新,您的浏览器将使用所有相同的数据重新提交POST请求,可能会创建您正在创建的任何内容的重复实例。浏览器会警告用户这一点,这样他们就可以中止操作,但这可能会让用户感到困惑,也会带来不必要的不便。
至于你问题的第二部分,不要太诚实。我的猜测是,由于您已经在更新所讨论的对象,所以您已经有了它的副本,因此不需要返回它的另一个实例。话虽如此,更新对象可能会触发各种回调,这些回调会修改对象的其他属性,因此使用这些修改返回更新的对象可能是有意义的。
发布于 2010-09-03 08:31:34
在创建或更新时,redirect_to(@whatever)清除post,这样用户就不会通过刷新重新提交。它还显示了创建大小写的地址栏中正确的url,该url发布到集合路径(/whatevers)。
当您通常已经在dom中拥有对象时,head :ok会在更新时做出最小的响应。如果在更新后更新页面,标准方法是使用rjs视图更新dom元素和呈现部分。
https://stackoverflow.com/questions/3633020
复制相似问题