2009-05-04 9 views
44

Mam kontroler z wieloma działaniami, które przyjmują: rok i: miesiąc jako atrybutów z adresu URL. Zrobiłem prywatną metodę check_date na sprawdź, czy data jest poprawna i sprawdź, czy data nie jest w przyszłości.Jak zatrzymać wykonywanie kontrolera po użyciu polecenia redirect_to? (Korzystanie z szyn)

def check_date(year, month) 
    if month < 1 || month > 12 || year < 2000 
    flash[:notice] = I18n.t 'archive.invalid_date' 
    redirect_to :action => 'index' 
    elsif year > Date.today.year || (year == Date.today.year && month > Date.today.month) 
    flash[:notice] = I18n.t 'archive.no_future' 
    redirect_to :action => 'month_index', 
     :year => Date.today.year, 
     :month => Date.today.month, 
     :type => params[:type] 
    end 
end 

Czy istnieje sposób szyn kończąc wykonanie kontrolera po redirect_to?

Sposoby mogę myśleć są albo rzucić wyjątek po redirect_to lub zwrócić wartość z check_date i sprawdzić w każdej akcji, która nazywa go - coś jak

def month_index 
    year = params[:year].to_i 
    month = params[:month].to_i 
    if !check_date(year, month) 
    return 
    ... 
end 

Ale zastanawiam się, czy istnieje jakiś fajny sposób na zrobienie tego. Byłem w połowie mając nadzieję, że po wywołaniu przekierowania na szyny rozpoznałem, że chcę zatrzymać się na , ale to się nie wydaje.

Odpowiedz

35

Prawdopodobnie chcesz użyć filtrów.

Jeśli zadzwonisz pod numer check_date jako before_filter w kontrolerze, fakt, że jest on renderowany lub przekierowywany, uniemożliwi kontrolerowi wywołanie metody działania. Kończy się tam i wtedy.

+1

Może to rozwiązać problem pytającego, ale przyjechałem tutaj, spodziewając się rozwiązania takiego jak vrish88. – iphone007

6

redirect_to po prostu mówi szynom, co renderować po zakończeniu. Railsy będą zdezorientowane, jeśli dodasz inne renderowanie lub przekierowanie do dyrektyw po tym, którego naprawdę chcesz, więc po prostu wróć z kontrolera po przekierowaniu - to "normalny" sposób robienia rzeczy.

16

Można dorzucić

return false 

gdziekolwiek chcesz wykonanie kodu w swoim działaniu, aby zatrzymać

+4

właściwie, wystarczy zwrot. – kch

+3

tak, ale gdy jest to w prywatnej funkcji, muszę sprawdzić wartości zwracane, więc szukałem bardziej automatycznego sposobu - tak jak przedfiltrem –

+0

@HamishDowner W takim przypadku zdecydowanie chciałbym, aby funkcja prywatna zwróciła stan w postaci natywnej do tego, co robi, tj. symbol, jeśli zwraca inne symbole, "fałsz", jeśli normalnie zwróci "prawda", "zero", jeśli normalnie zwróci inne dane, lub może nawet formę zmiennej wyjściowej lub wyjątku jeśli to wydaje się najlepsze dla pomocnika. Następnie kontroler powinien podnieść się, jednak funkcja prywatna wyraża stan negatywny i reagować na to.Mieszanie funkcji metody kontrolera w funkcję prywatną nie tylko szybko się brudzi, ale także utrudnia ponowne wykorzystanie. –

47

Można również zrobić:

return redirect_to :action => 'index' 

i

return redirect_to :action => 'month_index', 
    :year => Date.today.year, 
    :month => Date.today.month, 
    :type => params[:type] 

ponieważ wygląda ładniej zwrot z inwestycji na własnej linii (IMHO).

+0

Lub 'redirect_to: action => 'index' i return" – Rigo

0

Myślę, że OP jest zdezorientowany co do funkcji redirect_to.

redirect_to przekieruje pod koniec działania. Jednak reszta funkcji kontrolera będzie wykonywana jak zwykle. Wszystko, co musisz zrobić (w postaci opublikowanej przez inne osoby), to uwzględnić zwrot, tak jak powinieneś wywołać każdą inną funkcję.

Powiązane problemy