我有一個不需要表單的操作。所以它實際上只需要一個'編輯'方法而不是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