Domanda Come posso interrompere l'esecuzione del controller dopo aver usato redirect_to? (Utilizzo di Rails)


Ho un controller con più azioni che richiedono: anno e: mese come attributi dall'URL. Ho fatto un metodo privato check_date a controllare la data è valida e controllare la data non è in futuro.

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

Esiste un modo per terminare l'esecuzione del controller dopo il redirect_to?

I modi a cui posso pensare sono di lanciare un'eccezione dopo il redirect_to o di restituire un valore da check_date e controllarlo in ogni azione che lo chiama - qualcosa come

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

Ma mi chiedo se ci sia un bel modo per farlo. Ero a metà sperando che aver chiamato redirect_to bails riconoscesse che volevo basta, ma non sembra che accada.


44
2018-05-04 16:21


origine


risposte:


Probabilmente vuoi usare i filtri.

Se chiami il tuo check_date come un before_filter nel controller, il fatto che sia reso o reindirizzato impedirà al controller di chiamare sempre il metodo di azione. Finisce lì e poi.


35
2018-05-04 16:46



Puoi anche fare:

return redirect_to :action => 'index'

e

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

dal momento che sembra più bello di mettere il ritorno sulla propria linea (IMHO).


48
2017-11-18 00:40



Puoi entrare

return false

ovunque tu voglia interrompere l'esecuzione del codice nella tua azione


16
2018-05-04 17:40



redirect_to dice solo alle guide cosa mostrare quando finisce. Le rotaie si confondono se si aggiungono altre render o redirect_to alle direttive dopo quella che si desidera realmente, quindi basta tornare dal controller dopo il redirect_to - è il modo normale di fare le rotaie per fare le cose.


6
2018-05-04 16:39



Penso che l'OP sia confuso riguardo alla funzione di redirect_to.

redirect_to reindirizzerà alla fine dell'azione. Tuttavia, il resto della funzione controller verrà eseguito normalmente. Tutto quello che devi fare (come pubblicato da altre persone) è includere un ritorno, come ogni altra chiamata di funzione.


0
2017-12-14 18:23