2013-04-01 34 views
1

我正試圖使用​​裸露的骨骼軌道控制器,並在同一時間有更細粒度的控制。如果我在:新行動,我回應我的新@實例,我得到一個狀態代碼200並呈現:新模板。在展會上,同樣的事情,不同的模板。到現在爲止還挺好。但是,在創作上,我遇到了意想不到的事情。如果新記錄成功並且我打電話給respond_with,我將被重定向到顯示(狀態碼302),這是正確的。但是,如果由於記錄無效而無法創建新記錄,則默認的respond_with通過發佈狀態碼200並呈現新模板來響應。模板是正確的,狀態碼不是。答案代碼是否應該在這種情況下422(不可處理的實體)?Rails和respond_with:爲什麼狀態碼不正確?

+0

我從來沒有見過Rails會返回一個422.在這種情況下它似乎是合適的,但我不認爲Rails默認返回它。也許它會在JSON響應?你可以在你的'render'中加入'status::unprocessable_entity'來強制它。 –

+0

如何在respond_with中設置狀態?這是我的問題。而且,從語義角度來看,渲染必須做什麼和響應數據包?似乎渲染將數據包捆綁在一起並將其交付給機架處理程序。爲什麼我無法在渲染範圍外設置響應內容?我發現這種限制。 – ChuckE

回答

1

Rails返回200響應,因爲它成功呈現'新'模板。對於非AJAX請求,這通常工作正常,因爲您還會在這種情況下向用戶顯示驗證錯誤,以便他們知道發生了什麼。

您應該需要422響應的唯一原因是,如果信息是通過AJAX提交的,並且您的客戶端JavaScript取決於響應代碼以知道該怎麼做。就像Jim說的那樣,如果你需要的話,你可以使用:status選項強制響應代碼進行渲染。在默認的「簡單」情況下,雖然沒有涉及AJAX,但您可能不需要它。

更新:jQuery客戶端可能依賴於響應代碼,通過在.ajax函數中包含'錯誤'回調或通過.ajaxError

+0

我不同意。狀態代碼與響應是否被呈現無關。無論狀態碼如何,HTTP響應都有一個以某種格式編碼的主體。任何瀏覽器都會呈現帶有有效HTML正文的HTTP 404錯誤響應。狀態碼對於瀏覽器來說非常重要。另一方面,AJAX響應的行爲有所不同。你有沒有嘗試用Rails的4xx狀態代碼發出一個AJAX響應,使用,比方說,jQuery?我可以告訴你,這是行不通的。 jQuery不會從非200響應中評估身體。 – ChuckE

+0

而且沒有成功的「新」模板渲染。 Rails構建響應,但不會呈現它。瀏覽器呈現它。 Rails構建了許多響應數據包,包括404和500標準響應,這些響應總是由瀏覽器呈現,否則在開發模式下不會看到美麗的回溯。 – ChuckE

+0

Rails有一個名爲'render'的方法,當處理一個控制器動作時,它會被顯式或隱式地調用。在Rails命名法中將這個過程稱爲「渲染」是很正常的。在這個意義上,瀏覽器將「呈現呈現的響應」。也許是一個超載的術語,但沒有任何不正確的。 –