Подтвердить что ты не робот

Как остановить выполнение контроллера после использования redirect_to? (Использование Rails)

У меня есть контроллер с несколькими действиями, которые принимают: year и: month as атрибуты из URL-адреса. Я сделал частный метод check_date для проверьте дату и проверьте дату в будущем.

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

Существует ли рельс для завершения выполнения контроллера после redirect_to?

Способы, о которых я могу думать, это либо выбросить исключение после redirect_to, либо вернуть значение из check_date и проверить его в каждом действии, которое его вызывает - что-то вроде

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

Но мне интересно, есть ли какие-то хорошие рельсы. Я был наполовину надеясь, что, вызвав redirect_to рельсы, я узнаю, что хочу остановить, но это, похоже, не происходит.

4b9b3361

Ответ 1

Возможно, вы захотите использовать фильтры.

Если вы вызываете свой check_date как before_filter в контроллере, тот факт, что он отображается или перенаправляется, не позволит контроллеру когда-либо вызвать метод действия. Он заканчивается тут же.

Ответ 2

Вы также можете сделать:

return redirect_to :action => 'index'

и

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

поскольку он выглядит лучше, чем возврат на свою линию (IMHO).

Ответ 3

Вы можете бросить

return false

где бы вы не остановили выполнение кода в своем действии

Ответ 4

redirect_to просто показывает рельсы, что делать, когда он заканчивается. Rails запутаются, если вы добавите другие директивы render или redirect_to после того, что вы действительно хотите, так что просто возвращайтесь с контроллера после перенаправления_to - это "нормальный" рельс, чтобы делать что-то.

Ответ 5

Я думаю, что OP запутался в функции redirect_to.

redirect_to будет перенаправлен в конце действия. Однако остальная часть функции контроллера будет выполняться, как обычно. Все, что вам нужно сделать (как опубликовано другими людьми), это включить возврат, как и любой другой вызов функции.