好的,我正在尝试了解HTML和XML格式的CREATE和UPDATE方法的最佳实践。 rails生成器生成的控制器的默认代码对我来说有点不清楚。
对于CREATE方法,给定一个很好的保存,生成器对HTML的“ redirect_to(@whatever)”和“ render:xml => @whatever,:status = >:created,:location => @whatever “for XML。
鉴于保存效果不佳,生成器会为HTML显示“ render:action =>'new'”和“呈现:xml => @ whatever.errors,:状态=>:unprocessable_entity “for XML。
然而,对于UPDATE方法,给定一个好的更新,生成器对于HTML的“ redirect_to(@whatever)”和对XML的“ head:ok ”说
并且,鉴于更新错误,生成器会为HTML显示“呈现:操作=>'编辑'”,并且“渲染:xml => @ whatever.errors, :status =>:unprocessable_entity “for XML。
我理解这一点,这对我来说很有意义,并且工作得很好 - 但是,我有两个问题:
首先,对于成功的CREATE和UPDATE,HTML格式,为什么“ redirect_to(@whatever)”而不是“ render:action =>'show'” ?我理解重定向和渲染之间的区别,只是更好奇你们往往会采用哪种方式以及为什么这样做。似乎重定向将是浏览器不必要的额外旅行。
其次,为什么“ head:ok ”成功通过XML更新,但“渲染:xml => @whatever,:status =>:created,:location =&gt ; @whatever “成功通过XML创建?这似乎与我不一致。看起来像通过XML成功更新应该与通过XML成功创建CREATE相同。好像你需要返回新的/更新的对象,所以你可以测试它。你们是怎么做到的?为什么?
答案 0 :(得分:1)
在创建或更新时,redirect_to(@whatever)
清除帖子,以便用户不会通过刷新重新提交。它还在创建案例的地址栏中显示正确的URL,该URL发布到集合路径(/ whatevers)。
head :ok
在更新时做出最小的响应,通常你已经拥有了dom中的对象。如果您在更新后更新页面,则标准方法是使用rjs视图更新dom元素并渲染部分。
答案 1 :(得分:1)
当Sam C回复时,我已经写出来了,但无论如何它仍然是: - )
第一部分 - 为什么重定向而不是渲染?我能想到的两个原因:
1)这是一致的。如果您呈现了show动作,并且用户稍后在返回该页面时使用了后退按钮,则用户将看到意外行为。某些版本的IE会给你某种会话超时错误IIRC,其他浏览器可能会更优雅地处理它。
如果用户为该页面添加了书签并在以后使用GET请求返回该页面,则同样如此 - 他们将看不到show动作。您的应用可能会抛出错误或者可能会呈现索引操作,因为用户正在请求http://my.app.com/users之类的网址,这会在使用GET请求时映射到索引操作。
2)如果渲染show动作而不重定向到GET请求并且用户点击刷新,则浏览器将重新提交具有所有相同数据的POST请求,可能会创建您正在创建的任何内容的重复实例。浏览器会向用户发出警告,以便他们可以中止,但这可能会让人感到困惑和不必要的不便。
关于你问题的第二部分,不太确定是诚实的。我的猜测是,因为你已经在更新有问题的对象,所以你已经有了它的副本,所以不需要返回它的另一个实例。话虽如此,更新对象可能会触发修改对象的其他属性的各种回调,因此使用这些修改返回更新的对象可能有意义。