ruby-on-rails - RESTful Controller CREATE 和 UPDATE 方法的 Rails 最佳实践

标签 ruby-on-rails rest

好的,我正在尝试了解 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/

相关文章:

Rest-Assured - 对于包含路径参数的 Get 请求给出 404 错误

python - 处理 REST API 的不同响应数据类型

javascript - Firebase + REST + jquery 产生奇怪的键

javascript - Backbone.js 未正确呈现 View

ruby-on-rails - Docker容器中的Rails应用程序不会在开发中重新加载

html - Rails 静态页脚布局

ruby-on-rails - 是否可以将 Rails 将 blog.mydomain.com 掩码为 mydomain.com/blog?

c++ - C++ 中的动态 JSON 消息;

Python 请求 + Marketo REST API

ruby-on-rails - ActiveRecord::RecordNotFound - 无法找到 id=new 的联系人