作爲一名長期使用Ruby和Rails的用戶,直到今天才真正想到了Rails中的get-and-redirect模式。這樣做的典型的例子是調用Create()行爲,然後將用戶重定向到一個節目()動作,以顯示新創建的項目:redirect_to對於RESTful應用程序無法正常工作?
class JournalEntries def index @entries = JournalEntry.all end def create @entry = JournalEntry.new(:name => "to-do list") @entry.save redirect_to :action => "index" end end
然而,這有固有的缺點,你是雙倍的網絡流量。這既會降低用戶的網站體驗速度,也會增加您的帶寬費用。
那爲什麼不這樣做,而不是:
def create @entry = JournalEntry.new(:name => "to-do list") @entry.save index
同樣的輸出,並且不需要額外的開銷。但除此之外,還有一個更重要的問題:redirect_to只能使用GET進行重定向。這對使用四種不同HTTP方法的RESTful應用程序造成嚴重問題。
就我而言,我希望用戶能夠調用/ journals/8並使用該ID檢索日誌。如果找不到,我想創建一個新的空白日記對象。無論哪種情況,Journal對象都會被髮送給調用者。
請注意,RESTful Rails中的create()方法是從「POST/players」路由的。但是由於redirect_to(和底層的HTTP重定向)只能發送GET請求,它實際上會重定向到「GET/players」,這是index()方法。這種行爲顯然是錯誤的。
我能想到的唯一解決方案就是簡單地調用create()而不是redirect_to(),如上面的示例中所示。它似乎工作正常。
有關爲什麼redirect_to優先於直接調用動作的任何想法?
只是對第二點的評論。正如我所理解的那樣,REST的一點是絕對不要使用GET進行更新,所以這絕不應該是一個問題。 – 2009-12-21 23:07:59
@Jimmy:同意,在適當的REST中它不應該發生。 – 2009-12-21 23:24:17
所以基於你們都說,這聽起來像問題是,我想要做的事情本質上是不安寧的 - 如果一個人想要返回一個對象,如果它存在,並創建它,如果它不存在,那會需要兩個獨立的電話: GET/journal/1 (如果這不返回記錄,則客戶端調用): POST/journals/[POST data:journal.id = 5] 這是正確的嗎?也就是說,在REST中沒有一次性調用既可以作爲單個操作來執行? – mrjake2 2009-12-22 00:01:28