2

モデルの更新メソッドで取り除くことができない二重レンダリング エラーが発生しています。

これがコントローラーのコードです

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呼び出され、renderfrom index が実行されてからリダイレクトが発行されて失敗します。

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

4

3 に答える 3

4

さて、本当の原因は

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

index最初にレンダリングするメソッドを呼び出します。その後redirect_to、呼び出しはその関数の結果を返します(これはrender呼び出しがindex返すものになります)。2回目のレンダリング

あなたが本当に書きたいのはこれです:

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

ここで:action、シンボル、つまりアクションを表すが直接呼び出さないインデックスに設定します。

于 2012-05-08T14:13:09.370 に答える
1

あなたが持っている

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 
于 2012-05-04T22:03:55.240 に答える
0

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

これにより、このエラーが発生する可能性がありますか? Rails は ActionMailer の電子メール テンプレートのレンダリングは通常のレンダリングだと思いますか? それは単なる推測であり、他に何ができるかわかりません...また、100%再現することはできませんが、ログにコントローラーへの呼び出しが1つしかないため、同時実行のようには見えません。

どんなアイデアでも歓迎します、ありがとう。

于 2015-01-14T15:32:10.213 に答える