2013-03-14 16 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 

Jeśli mam wykonywania tego, otrzymuję błąd jakredirect_to i uczynić z powrotu

Render i/lub przekierować nazywane były wielokrotnie w tej akcji. Zwróć uwagę, że możesz wywoływać tylko przekierowanie do renderowania i co najwyżej raz na działanie. Zwróć też uwagę, że ani przekierowanie, ani renderowanie nie powoduje zakończenia działania, więc jeśli chcesz zakończyć działanie po przekierowaniu, musisz wykonać polecenie "redirect_to (...) and return".

Jeśli skorzystam z funkcji "Powrót", która przenosi mnie na inną stronę, a nawet wiadomość flash nie jest wyświetlana. Jak to naprawić?

Odpowiedz

1

dodać tylko and return na koniec każdego redirect_to lub render jak poniżej

`redirect_to @game_school and return` 

To będzie pracować dla Ciebie

+2

co z przekierowaniem na Xyz i Z powrotem? – Lee

+1

'i' oraz '&&' (lol) mają dwa bardzo różne znaczenia w języku Ruby pod względem pierwszeństwa (patrz http://ruby-doc.org/core-2.3.0/doc/syntax/precedence_rdoc.html). W takim przypadku powinieneś użyć 'i'. Jest to również inny interesujący materiał na ten temat: http://devblog.avdi.org/2014/08/26/how-to-use-rubys-glish-andor-operators-without-going-nuts/ – lucke84

8

każdym użyć render lub redirect w kontrolerze, żadna część pozostałego kodu powinien mieć render lub przekierowanie, chyba że jest pewne, że nie zostanie przekazane. przy użyciu kodu

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

jeśli uwierzytelnienie nie powiedzie się podczas aktualizacji atrybutów, używasz render :invite_tutor_form. Ale kod będzie kontynuował działanie następnej części kodu, która jest

if redirect_with_msg 
    redirect_to @game_school, notice: "daw" 
else 
    redirect_to @game_school 
end 
, więc pojawi się ten błąd. Najprostszym rozwiązaniem jest dodanie return po wywołaniu 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 

Proszę należy pamiętać, że jeśli robisz więcej przetwarzania (np aktualizowania inne atrybuty, lub wysyłając e-maile), jeżeli po bloku, który zawiera return ci, część kodu nie zostanie wykonana.

+0

Jeśli używasz 'redirect_to' czy nadal potrzebujesz' return'? – barnett

+1

Tak, nie możesz mieć dwóch z nich w tej samej akcji. – jvnill

+0

Wyjątkiem byłoby użycie '' redirect_to' w 'before_action'. Nie musisz wykonywać zwrotu, jeśli przekierowanie nastąpi przed wykonaniem czynności. – saneshark