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