2012-05-04 102 views
2

我得到一個雙重渲染錯誤,我無法擺脫我的模型的更新方法。無法擺脫AbstractController :: DoubleRenderError

下面是控制器

class Admin::CmsHappeningNowFeatureController < ApplicationController 

    def index 
     # Various model data retrieval... 

     render 'admin/cms/hn_features/index', layout: 'admin_cms' 
    end 

    # Works fine 
    def edit 
     @feature = CmsHappeningNowFeature.find_by_id(params[:id]) 
     render 'admin/cms/hn_features/feature', layout: 'admin_cms' 
    end 

    # Throws a AbstractController::DoubleRenderError upon submission 
    def update 
     @feature = CmsHappeningNowFeature.find_by_id(params[:id]) 
     @feature.attributes = params[:cms_happening_now_feature] 
     if @feature.save 
      redirect_to(:action => index, :notice => "Successfully updated feature.") and return 
     end 
     render 'admin/cms/hn_features/feature', layout: 'admin_cms' 
    end 

    # ... rest of the class 
end 

當重定向到另一個控制器的代碼,這個問題就會消失。似乎重定向到相同的控制器使得rails無需實際發送重定向就可以執行該方法。通過查看日誌,當提交更新表單時,update被調用,然後index被調用,render從索引被執行,然後重定向被髮出並失敗。

我錯過了什麼?什麼是解決方法?

回答

4

好吧,真正的原因是在

redirect_to(:action => index, :notice => "Successfully updated feature.") and return 
#      ^^^^^ This calls the index method 

你打電話給index方法,然後先渲染。然後redirect_to調用將返回該函數的結果(這將是renderindex返回中調用的任何值)。並呈現第二次

你真的想寫這是什麼:它代表了行動,但不直接調用它

redirect_to(:action => :index, :notice => "Successfully updated feature.") and return 

你設置:action一個符號,即指數。

+0

哈!謝謝!我沒有注意到':action => index'實際上正在調用'index'並將結果返回給':action' – Damp

0

你有

if @feature.save 
    redirect_to(:action => index, :notice => "Successfully updated feature.") and return 
end 

會被重定向到指數再從指數,得到

拋出的錯誤試試這個,讓我知道,如果它再次重定向:

if @feature.save 
    index 
    flash[:notice] = "Successfully updated feature." 
    return 
end 
+1

但是,這個工作原理並沒有得到更新,如果用戶點擊刷新,表單被重新提交,這是一個很大的缺點...這是使用重定向的全部優勢。我設法解決這個問題的唯一方法是指定一個路徑,例如'redirect_to admin_cms_hn_feature_index_path,:notice =>「成功更新的功能。」並返回' – Damp

+0

我不知道爲什麼redirect_to命令會在重定向到它之前實際執行操作'index'。這是令人困惑的,而不是你對命令的期望。 – Damp

0

我也遇到過這個問題,但它沒有涉及任何重定向到或在控制器中的多個呈現。我們有一個直接觸發電子郵件的操作,不需要後端隊列。這使用了ActionMailer gem,我相信它會在.haml或其他模板上生成一個呈現給電子郵件的html。然後,我們發送電子郵件後使用 渲染更新電話結束

這可能會導致此錯誤? Rails認爲ActionMailer的電子郵件模板呈現是一個普通呈現?它只是一個猜測,不知道它可能是什麼.....我也無法100%重現它,但看起來並不像併發的東西,因爲在日誌中我只看到一次對控制器的調用。

任何想法歡迎,謝謝。

+0

FYI我發現了這個原因。如果Rabl以某種方式設置了子節點並且期望一個項目但是獲得了多個,則可能會發生這種情況。所以它就像一個包括拉布爾的孩子會被無限期渲染兩次,並且發生這種情況。我對此感到驚訝,認爲json會有雙倍/額外的數據。 – bjm88