2013-08-24 135 views
0

我正在嘗試遵循RailsTutorial指南,而是通過自己的應用程序來代替。我在第7節遇到了問題。編輯後保留在同一頁面

我的控制器:

def update 
    d = Deck.find(params[:id]) 
    d.title = params[:deck][:title] 
    d.slug = params[:deck][:slug] 
    d.category = params[:deck][:category] 

    if d.save 
     redirect_to deck_path(d), notice: "Deck saved successfully" 
    else 
     render :edit 
    end 

    end 

我知道這是非常,從良好的代碼很遠,但以後我會重構它(如果你有一個建議,我所有的耳朵,但我用Rails 3中,所以我猜Rails 4的強大參數已經出來)。

問題是當d.save不起作用(由於驗證),與render :edit

現在,當我輸入無效數據時,它會嘗試重定向到show操作,並且因爲它沒有任何要顯示的數據而崩潰。
如果我在render之上添加@deck = d,它可以工作,但url仍然是show操作。

如果我的驗證失敗,我該如何留在相同的URL並顯示我的錯誤消息? 「更改網址但呈現相同頁面」行爲被接受爲有效嗎?

謝謝!

如果你有興趣看代碼的其餘部分,它在這裏:https://github.com/cosmo0/TeachMTG/tree/remodel-decks

回答

3

其實當它失敗你的網址不是'顯示'它是'更新'網址。

您的代碼有效。

當您提交表單時,瀏覽器向控制器#更新發送POST請求。

當更新失敗時,您將更新操作告訴「render:edit」。它所做的是呈現:update路由中的:edit動作。

更新路由使用的網址與你的表演動作: 運行時,「耙路線」你可以檢查此,唯一不同的是,該方法是POST的「更新」 VS獲取「秀」

這就是爲什麼您認爲它是瀏覽器中的顯示網址,但實際上一切正常:您正在執行呈現:編輯的更新操作。

(訴說更新行動「呈現:編輯」並不意味着你會被重定向到:編輯從後:更新)

那是不夠清楚嗎?

+0

是的,我忘記了考慮http動詞。我現在明白了這種行爲。謝謝 ! – thomasb

1

我相信你正在尋找respond_with方法。

+0

關於如何使用respond_with的更多信息? – fatuhoku

1

我想你是誤解了寧靜世界裏發生的事情。當您進行更新時,URL正在更改,因爲您的表單正在執行HTTP POST

如果d.save工作,它會以d作爲對象重定向到您的deck_path。如果失敗,它不會更改瀏覽器中的URL,但會呈現與edit操作相同的頁面。

我猜在呼籲edit行動你有這樣的:

@deck = Deck.find(id) 

渲染失敗,因爲你沒有在你的更新分配@deck變量。因此,您可以將所有d的實例更改爲@deck或使用您的解決方案@deck = d

相關問題