2012-02-13 32 views
1

給定軌的RESTful控制器渲染背後的理由:新建代替redirect_to新建POST?

class WidgetsController 
    def new 
    @widget = Widget.new 
    end 

    def create 
    @widget = Widget.new(params[:widget]) 
    render :new and return unless w.save 

    redirect_to widget_path(@widget) 
    end 
end 

除了捕捉到的參數和渲染驗證消息的原因是該公約的render :new,而不是redirect_to new_widget_path如果驗證失敗?

由於URL將從/widgets/new更改爲/widgets如果驗證失敗不會破壞REST的概念嗎?

+0

如果你重定向,你正在失去params數組,並且你不能預填充字段中的值 – yoavmatchulsky 2012-02-13 11:35:43

+0

是的,我知道如果有重定向,失去params哈希值。我想知道的是除了打破REST之外,還有其他什麼原因嗎? (如果它打破了它) – roo 2012-02-13 13:31:31

回答

0

渲染的事情是它不會導致生成另一個請求。它將轉到相應的視圖並顯示它。但是,如果使用重定向,則會向瀏覽器發出重定向請求,這將導致您的服務器發出另一個請求。

2

渲染將不會調用控制器操作,因此您在創建操作中設置的實例變量將被帶到新視圖。

這意味着任何驗證錯誤在新視圖中堅持......

redirect_to時將運行新的控制器動作,因此創建模型的新實例...你將失去的錯誤。 ..

希望這可以幫助

1

你能做到這一點,而不是呈現新的行動?

flash[:thing] = params[:thing] 
    redirect_to new_thing_path 

然後在新

@thing = Thing.new(flash[:thing] || params[:thing]) 

這種誠實似乎更好的給我,否則,如果您有任何邏輯控制器所需渲染新建/編輯行動,你必須重複該邏輯(或創建一些before_filter或更新/創建)。我意識到這涉及到一個更多的請求,但除此之外,代碼看起來更簡單和更安全(除了您打破了rails約定),並且它爲用戶提供了一個有效的url,以便查看/執行相同的操作事情。

如果他們刷新,他們會失去他們的價值觀,但提交之前,這是真實的任何形式。這似乎對我更有意義而不是提神,導致重新提交這個很奇怪的警告。例如,用戶應該如何清除表單?

這個rails-ism總是給我帶來了麻煩。我沒有考慮過這個問題嗎?其他應用程序框架都做同樣的事情嗎?