В действии контроллера, когда мы набираем render
или redirect_to
, они выполняются не сразу, а ставятся в очередь и будут выполняться после завершения метода.Таким образом, это позволяет иметь двойной рендер или redirect_to в действии контроллера, и это приведет к ошибке (потому что тогда rails не имеет представления, что выполнять).Вот почему в рельсах они добавили метод performed?
, который будет указывать, был ли render
или redirect_to
уже вызван (в очереди) или нет.
В большинстве случаев это на самом деле не нужно, потому что обычно код вашего контроллера довольно прост.
Чтобы уточнить: performed?
на самом деле не проверяет, что redirect_to
было выполнено, он просто проверяет, что рендер или перенаправление на вызвано / поставлено в очередь.Кроме того, redirect_to
не возвращает логическое значение, указывающее, было ли это сделано или нет.
Таким образом, ваш код должен выглядеть следующим образом:
if condition
does something
else
redirect_to(records_path)
end
if performed?
# the redirect-to was executed
does another thing # but not a render or redirect
else
yet another thing
# and could be a render or redirect
# if not the normal view will be rendered
end
Пожалуйста, обратите внимание, что в этом простом примере performed?
является просто отрицательным значением condition
, так что вы можете легко сложить их вместе.