2011-10-14 46 views
3

我有一個控制器更新模型屬性的更新方法,如果成功,爲用戶設置一個flash通知,然後再次呈現編輯頁面。點擊同一個Flash通知的下一個鏈接會在第二次加載/呈現頁面時彈出。這是怎麼回事?我如何獲得flash [:notice]只顯示一次?爲什麼它持續到下一個響應?閃存通知堅持在rails控制器

控制器:

def update 
    respond_to do |format| 
    if @resource.update_attributes(params[:resource]) 
     flash[:notice] = "Resource successfully updated" 
     format.html{ render :action => "edit" } 
    else 
     format.html{ render :action => "edit" } 
    end 
    end 
end 

回答

12

如果你想立即顯示閃光通知,請使用flash.now[:notice]代替flash[:notice]。默認行爲是保存閃存,直到處理後續請求,其中now版本將在當前請求完成後將其清除。

+0

謝謝。這個答案解釋了我所問的行爲的原因。 – Bee

+0

這個。這解決了我的問題。謝謝! –

2

成功版後不應該使用render方法。相反,嘗試使用redirect_to

respond_to do |format| 
    if @resource.update_attributes(params[:resource]) 
     flash[:notice] = "Resource successfully updated" 
     format.html{ redirect_to :action => edit, :id => @resource } 
    else 
     format.html{ render :action => "edit" } 
    end 
end 

檢查Rails Guide有關這兩種方法之間的差異的詳細信息。

+0

我理解渲染/重定向之間的區別,在這種情況下渲染模板視圖基本上看起來更直接,而不是重定向。 (不需要往返於瀏覽器,並且沒有特殊的狀態是我想要的視圖所必需的)。所以我想知道你上面的「不應該」。如果將來編輯行爲確實需要特殊狀態,是否只是潛在地重複自己(或導致錯誤)的問題? (ala鏈接中的書籍示例)還是還有其他考慮因素? – Bee

+0

@Bee例如,將頁面添加到收藏夾中會導致一些問題。人們會希望,如果您在訪問它時收到一個標有「這是一個編輯頁面」的頁面,就會看到編輯頁面。在這種情況下,你會看到顯示頁面。您也可以嘗試刷新頁面,看看你得到了什麼。我記得閱讀了關於這個問題的一篇很好的文章,但我現在找不到它。當我找到它時,我會在我的評論中鏈接它。 – maro

+0

感謝您回覆@maro!我沒有考慮過關於書籤的問題,因爲它可能會改變爲在我的應用中重定向。但是,我將接受@ tadman的答案,因爲它直接回答了問題並解釋了由我的代碼導致的行爲。 – Bee