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

如果我正在执行此操作,则会收到错误消息

在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,并且每个操作最多调用一次。另请注意,重定向和渲染都不会终止操作的执行,因此如果您想在重定向后退出操作,则需要执行“redirect_to(...) and return”之类的操作。

如果我使用 return 它会将我带到其他页面,甚至没有显示 flash msg。如何解决这个问题?

4

2 回答 2

8

每次您使用renderredirect在控制器中,其余代码的任何部分都不应该有渲染或重定向,除非它确定它不会被传递。使用您的代码

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在调用后添加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 回答