Как остановить выполнение контроллера после использования redirect_to? (Использование Rails) - PullRequest
44 голосов
/ 04 мая 2009

У меня есть контроллер с несколькими действиями, которые выполняют: год и: месяц как атрибуты из 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 rails узнает, я хотел остановись, но этого, похоже, не происходит.

Ответы [ 5 ]

48 голосов
/ 18 ноября 2009

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

return redirect_to :action => 'index'

и

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

, так как это выглядит лучше, чем вывод return в отдельной строке (ИМХО).

35 голосов
/ 04 мая 2009

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

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

16 голосов
/ 04 мая 2009

Вы можете добавить

return false

везде, где вы хотите, чтобы выполнение кода в вашем действии было остановлено

6 голосов
/ 04 мая 2009

redirect_to просто указывает рельсам, что визуализировать после его завершения. Rails будет сбит с толку, если вы добавите другие директивы render или redirect_to после той, которая вам действительно нужна, поэтому просто возвращайтесь из контроллера после redirect_to - это «обычный» путь rails для выполнения действий.

1 голос
/ 14 декабря 2015

Я думаю, что ОП сбит с толку функцией redirect_to.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...