2013-03-14 8 views
5
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 

Wenn ich dies ausgeführt wird, ich bin immer Fehler wieredirect_to und machen mit Rück

Render und/oder umleiten mehrmals in dieser Aktion aufgerufen wurden. Bitte beachten Sie, dass Sie nur render oder redirect und höchstens einmal pro Aktion aufrufen können. Beachten Sie auch, dass weder die Weiterleitung noch die Ausführung der Aktion beendet werden. Wenn Sie also eine Aktion nach der Weiterleitung beenden möchten, müssen Sie etwas wie "redirect_to (...) and return" ausführen.

Wenn ich zurück benutze es mich zu einer anderen Seite, und auch die Flash-Nachricht wird nicht angezeigt. Wie behebt man das?

Antwort

1

nur hinzufügen and return am Ende jedes redirect_to oder render wie unter

`redirect_to @game_school and return` 

Dies funktioniert für Sie

+2

was ist mit redirect_to xyz && zurück? – Lee

+1

'und' und '&&' (lol) haben zwei sehr unterschiedliche Bedeutungen in Ruby in Bezug auf die Präzedenz (siehe http://ruby-doc.org/core-2.3.0/doc/syntax/precedence_rdoc.html). In diesem Fall sollten Sie 'und' verwenden. Dies ist auch eine weitere interessante Ressource zum Thema: http://devblog.avdi.org/2014/08/26/how-to-use-rubys-english-andor-operators-without-going-nuts/ – lucke84

8

jedes Mal wenn Sie render oder redirect in einem Controller verwenden, sollte kein Teil des restlichen Code Rendern oder Weiterleiten, es sei denn, es ist sicher, dass es nicht übergeben wird. mit Ihrem Code

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

, wenn die Validierung fehlschlägt, wenn Sie die Attribute aktualisieren, sind Sie render :invite_tutor_form läuft. Aber der Code wird weiter auf den nächsten Teil des Codes laufen, der

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

ist, so dass Sie diesen Fehler bekommen. Die einfachste Lösung ist ein return nach dem Aufruf von 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 

Bitte Notiz hinzuzufügen, dass, wenn Sie mehr Verarbeitung tun (wie auch andere Attribute zu aktualisieren, oder E-Mail) nach dem if-Block, die return enthält, diejenigen, Ein Teil des Codes wird nicht ausgeführt.

+0

Wenn Sie verwenden 'redirect_to' brauchst du noch' return'? – barnett

+1

Ja, Sie können nicht 2 von beiden in der gleichen Aktion haben. – jvnill

+0

die Ausnahme wäre, wenn Sie 'redirect_to' in einer' before_action' verwenden. Sie müssen keine Rückgabe durchführen, wenn Ihre Weiterleitung vor Ihrer Aktion erfolgt. – saneshark