使用典型的GET动作对PUT有什么危害吗? (说再说)

时间:2010-01-31 00:54:00

标签: ruby-on-rails

我有一个不需要表格的动作。所以它真的只需要一个'编辑'方法而不是RESTful'编辑' - > “更新”。有没有理由不这样做或更好的方式?

def edit
  #Do a POST(PUT)
end

2 个答案:

答案 0 :(得分:2)

损害在于用户可以轻松导航到该网址并执行可能具有破坏性的操作。

/noform/edit   #URL typed by user => Action Performed
/noform/update #URL typed by user => Error is thrown, No Action Performed

正常的浏览体验会向服务器生成GET个请求。假设是,您可以轻松导航到(或键入地址栏)的任何页面都不会执行任何数据更改功能。

通过表单提交或AJAX请求生成的POST请求需要在服务器上更改数据的结果。

同样,PUTDELETE的两个“伪造”版本也不是您可以使用浏览器导航到的操作。

解决方案

解决方案是仅使用update操作,并且您最初链接到edit的位置使用以下内容:

button_to "Add new tracker", noform_path, :method => :put

如果存在任何类型的错误,您可能仍需要一个编辑路径来向用户显示,以便他们可以更正某些内容。但是根据你所描述的,一个update动作应该可以解决问题。

答案 1 :(得分:2)

获取应始终为idempotent - 即他们不应执行任何会改变应用程序,数据库等状态的操作。

正如旁边一样 - 在真正的RESTful形式中,编辑将由HTTP Update操作执行,但是Rails使用表单上的帖子和隐藏值来模拟这一点,因为浏览器没有HTTP更新。

我仍然不清楚为什么你需要没有输入字段的更新。或许更多细节会有所帮助。