6
 def confirm_invite_new_tutor
    redirect_with_msg = false
    @game_school = GameSchool.find(params[:id])
    existing_user_emails = params[:all_emails][:existing_user] || []
    new_users = params[:param_game_school][:game_school_invites_attributes]

if existing_user_emails.present?
      existing_user_emails.each do |existing_user|
        // some code
      end
      redirect_with_msg = true
    end
    if new_users.present? 
      if @game_school.update_attributes(params[:param_game_school])
        redirect_with_msg = true
      else
         render :invite_tutor_form
      end
    end
    if redirect_with_msg 
      redirect_to @game_school, notice: "daw"
     else
      redirect_to @game_school 
    end
  end

これを実行すると、次のようなエラーが発生します

このアクションでは、レンダリングおよび/またはリダイレクトが複数回呼び出されました。レンダリングまたはリダイレクトのみを呼び出すことができ、アクションごとに最大1回だけ呼び出すことができることに注意してください。また、リダイレクトもレンダリングもアクションの実行を終了しないことに注意してください。したがって、リダイレクト後にアクションを終了する場合は、「redirect_to(...)andreturn」のような操作を行う必要があります。

returnを使用すると、他のページに移動し、フラッシュメッセージも表示されません。これを修正する方法は?

4

2 に答える 2

8

renderまたはコントローラーで使用するたびredirectに、渡されないことが確実でない限り、残りのコードのどの部分にもレンダリングまたはリダイレクトを含めないでください。あなたのコードを使用して

if new_users.present? 
  if @game_school.update_attributes(params[:param_game_school])
    redirect_with_msg = true
  else
    render :invite_tutor_form
  end
end

属性を更新するときに検証が失敗した場合は、render :invite_tutor_form. しかし、コードはコードの次の部分を実行し続けます。

if redirect_with_msg 
  redirect_to @game_school, notice: "daw"
 else
  redirect_to @game_school 
end

そのエラーが発生します。return最も簡単な解決策は、呼び出しの後にa を追加することですrender

if new_users.present? 
  if @game_school.update_attributes(params[:param_game_school])
    redirect_with_msg = true
  else
    render :invite_tutor_form
    return
  end
end

を含む if ブロックの後にさらに処理 (他の属性の更新やメールの送信など) を行う場合return、コードのそれらの部分は実行されないことに注意してください。

于 2013-03-14T06:32:15.623 に答える
2

and returnそれぞれの最後に追加するredirect_torender 、以下のように

`redirect_to @game_school  and return`  

これはあなたのために働くでしょう

于 2013-03-14T06:30:38.180 に答える