我有一个不需要表单的操作。所以它实际上只需要一个'编辑'方法而不是RESTful'编辑' - >'更新'。有没有理由不这样做或更好的方式?对PUT使用典型的GET操作有没有什么坏处? (RESTfully)
def edit
#Do a POST(PUT)
end
我有一个不需要表单的操作。所以它实际上只需要一个'编辑'方法而不是RESTful'编辑' - >'更新'。有没有理由不这样做或更好的方式?对PUT使用典型的GET操作有没有什么坏处? (RESTfully)
def edit
#Do a POST(PUT)
end
危害是用户可以轻松导航到该网址并执行潜在的破坏性操作。
/noform/edit #URL typed by user => Action Performed
/noform/update #URL typed by user => Error is thrown, No Action Performed
正常的浏览体验生成GET
请求到服务器。假设是,您可以轻松导航到的任何页面(或输入到您的地址栏中)都不会执行任何数据更改功能。
A POST
通过表单提交或AJAX请求生成的请求需要在服务器上更改数据的结果。
类似地,PUT
和DELETE
的两个导轨“伪造”版本也不是您可以简单导航到使用浏览器的操作。
解决方案
的解决方案是只具有update
行动,您最初会链接到edit
使用类似以下内容:
button_to "Add new tracker", noform_path, :method => :put
如果有任何类型的错误,你可能仍然需要一个编辑路径来显示用户,以便他们能够纠正某些事情。但是从你所描述的情况来看,一个单独的动作应该可以做到。
获取应始终idempotent - 这是他们不应该执行任何动作,这将改变应用程序,数据库的状态等
正如旁白 - 在真正的RESTful形式的编辑会由HTTP Update操作执行,但Rails使用表单中的帖子和隐藏值来模拟此操作,因为浏览器没有HTTP更新。
它仍然不清楚为什么你需要一个没有输入字段的更新。也许更多的细节会有所帮助。
+1当我与某人谈论它时,我永远不会记住幂等性这个词。 – 2010-01-31 01:18:06
@ eed3si9n - 可能是弗洛伊德语块,它听起来像是你使用伟哥的东西。 – 2010-01-31 01:34:48
那么最新的解决方案?我应该提供一个基本上只是一个空表格或button_to的表单吗? 我真的不想让用户看到另一个屏幕,然后点击另一个按钮。 – Cameron 2010-01-31 01:00:04
搜索引擎蜘蛛程序加剧了POST问题,它会在您网站的每个页面上执行GET操作,系统地执行不需要的编辑和删除操作。 – 2010-01-31 01:05:12
@Cameron我更新了我的答案。如果不清楚,请告诉我。 – 2010-01-31 01:09:29