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.

Author: Hamish Downer, 2009-05-04

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.

 35
Author: kch,
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).

 48
Author: Slipp D. Thompson,
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

 16
Author: vrish88,
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.

 6
Author: Sniggerfardimungus,
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.

 0
Author: Tristan Tao,
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