Bud*_*ddy 6 rest ruby-on-rails
好的,我正在尝试理解HTML和XML格式的CREATE和UPDATE方法的最佳实践.rails生成器生成的控制器的默认代码对我来说有点不清楚.
对于CREATE方法,给定一个很好的保存,生成器对HTML 表示" redirect_to(@whatever) ",对XML表示 " render:xml => @whatever,:status =>:created,:location => @whatever ".
给定一个糟糕的保存,生成器对HTML 表示" render:action =>'new' ",对XML表示 " render:xml => @ whatever.errors,:status =>:unprocessable_entity ".
但是,对于UPDATE方法,在给定良好更新的情况下,生成器对HTML 表示" redirect_to(@whatever) ",对XML表示" head:ok ".
并且,如果更新错误,生成器会对HTML 进行" render:action =>'edit' ",对XML进行" render:xml => @ whatever.errors,:status =>:unprocessable_entity ".
我理解这一点,这对我来说很有意义,并且工作得很好 - 但是,我有两个问题:
首先,对于成功的CREATE和UPDATE,HTML格式,为什么" redirect_to(@whatever) "而不是" render:action =>'show' "?我理解重定向和渲染之间的区别,只是更好奇你们往往会采用哪种方式以及为什么这样做.似乎重定向将是浏览器不必要的额外旅行.
第二,为什么" head:ok "在通过XML成功更新后,但是" render:xml => @whatever,:status =>:created,:location => @whatever "成功通过XML创建?这似乎与我不一致.看起来像通过XML成功更新应该与通过XML成功创建CREATE相同.好像你需要返回新的/更新的对象,所以你可以测试它.你们是怎么做到的,为什么?
当 Sam C 回复时我已经把这个写出来了,但无论如何:-)
对于第一部分 - 为什么重定向而不是渲染?我能想到的两个原因:
1)它是一致的。如果您呈现了显示操作,并且用户稍后在返回该页面时使用后退按钮,则用户将看到意外的行为。某些版本的 IE 会给你某种会话超时错误 IIRC,其他浏览器可能会更优雅地处理它。
如果用户将该页面添加为书签并在稍后使用 GET 请求返回该页面,情况也是如此 - 他们不会看到显示操作。您的应用程序可能会抛出错误或可能呈现索引操作,因为用户正在请求类似http://my.app.com/users 的URL ,该 URL 在使用 GET 请求时会映射到索引操作。
2) 如果您渲染 show 操作而不重定向到 GET 请求,并且用户点击刷新,您的浏览器将使用所有相同的数据重新提交 POST 请求,可能会创建您正在创建的任何内容的重复实例。浏览器会警告用户这一点,以便他们可以中止,但这可能会造成混乱和不必要的不便。
至于你问题的第二部分,说实话不太确定。我的猜测是,由于您已经在更新相关对象,因此您已经拥有它的副本,因此不需要返回它的另一个实例。话虽如此,更新对象可能会触发修改对象其他属性的各种回调,因此返回带有这些修改的更新对象是有意义的。
| 归档时间: |
|
| 查看次数: |
1570 次 |
| 最近记录: |