Jak zatrzymać wykonywanie kontrolera po użyciu przekierowania do? (Za Pomocą Rails)
Mam kontroler z wieloma akcjami, które przyjmują: rok i: miesiąc jako atrybuty z adresu URL. Zrobiłem prywatną metodę check_date do sprawdź, czy data jest ważna i sprawdź, czy data nie jest w przyszłości.
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 Jest jakiś sposób zakończenia wykonywania kontrolera po redirect_to?
Sposoby, które mogę wymyślić, to albo rzucanie wyjątku po redirect_to, albo zwracanie wartości z check_date i sprawdzanie jej w każdej akcji, która ją wywołuje-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 jest na to jakiś fajny sposób. Byłem w połowie mając nadzieję, że po wywołaniu redirect_to rails rozpoznam, że chciałem przestań, ale tak się nie dzieje.
5 answers
Prawdopodobnie chcesz użyć filtrów.
Jeśli wywołasz {[0] } jako before_filter
w kontrolerze, fakt, że został on renderowany lub przekierowany, uniemożliwi kontrolerowi kiedykolwiek wywołanie metody akcji. Kończy się tam i potem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-04 16:46:14
Możesz 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 niż umieszczenie return na własnej linii (IMHO).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-22 03:28:20
Możesz dorzucić
return false
Gdziekolwiek chcesz, aby wykonanie kodu w Twojej akcji zostało zatrzymane
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-04 17:40:23
Redirect_to po prostu mówi rails, co ma być renderowane, gdy się skończy. Rails będzie zdezorientowany, jeśli dodasz inne dyrektywy render lub redirect_to po tej, którą naprawdę chcesz, więc po prostu wróć z kontrolera po redirect_to - jest to 'normalny' sposób rails na robienie rzeczy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-04 16:39:32
Myślę, że OP jest zdezorientowany co do funkcji redirect_to
.
redirect_to
przekieruje po zakończeniu akcji. Jednak reszta funkcji kontrolera będzie wykonywana jak zwykle. Wszystko, co musisz zrobić (zgodnie z zamieszczonymi przez inne osoby), to dołączyć zwrot, podobnie jak każde inne wywołanie funkcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-14 18:23:24