2012-05-04 16 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 

別のコントローラにリダイレクトするためのコードですが、問題が消えます。同じコントローラにリダイレクトすると、実際にリダイレクトを送信せずにメソッドが実行されるようです。ログを見ると、更新フォームを送信すると updateが呼び出され、 indexが呼び出され、 renderがインデックスから実行され、 にリダイレクトされ、失敗します。

私には何が欠けていますか?回避策は何ですか?

答えて

4

オーケーを実際の原因はその中にある。

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

indexメソッドを呼び出すと、最初にレンダリングされます。 redirect_toコールは、その関数の結果を返します(これは、indexが返す任意のrender呼び出しになります)。そしてあなたが本当に書きたいことは、この第二の時間

をレンダリング:アクションを表しますが、それを直接呼び出すことはありませんが、シンボルに:actionを設定

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

、すなわちインデックス。

+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

しかし、このURLは更新されず、ユーザーがリフレッシュするとフォームが再送信され、大きな欠点です...リダイレクトを使用することの利点です。私がこれを修正する唯一の方法は、 'redirect_to admin_cms_hn_feature_index_path、:notice => 'Successfully updated feature。'のようなパスを指定することです。 return' – Damp

+0

私はredirect_toコマンドが実際に 'index'アクションを実行する理由を知りません。これは紛らわしく、あなたがコマンドから期待するものではありません。 – Damp

0

私はこの問題に遭遇しましたが、コントローラのリダイレクトや複数のレンダリングには関係しませんでした。電子メールを直接トリガーするアクションがあり、それを置くためのバックエンドキューはありませんでした。これは、電子メールのHTMLを生成するために、.hamlや他のテンプレートのレンダリングを行うと思われるActionMailer gemを使用します。その後、電子メールを送信した後に レンダリングアップデートコールを最後に使用していました

このエラーが発生する可能性がありますか? RailsはActionMailerの電子メールテンプレートのレンダリングは通常のレンダリングだと思いますか?そのちょっと推測して、他に何ができるかわからない。また、私はそれを100%再現することはできないが、ログのように並行処理のようには見えない。

どのようなご意見もありがとうございます。

+0

FYI私はこの理由を発見しました。 rablがある種の方法で子ノードとその1つのアイテムでセットアップされているが、複数のノードが発生する可能性がある場合に表示されます。だから、子供のようなその種のrablは予期せず2回レンダリングされ、これが起こります。私はこれに驚きました.Jsonがダブル/エクストラデータを持っていると思っていました。 – bjm88

関連する問題