Как остановить выполнение контроллера рельсов?
У меня есть следующий фрагмент кода
def show
unless logged_in?
login_required
return
end
#some additional code
#that should only execute
#if user is logged in
end
Это прекрасно работает.
Теперь я хочу переместить проверку входа в фильтр перед фильтром.
Проблема в том, что когда я возвращаюсь из метода вне шоу, он не останавливает выполнение show... как я могу остановить show
от кода с помощью внешнего метода (то есть, который может быть вызывается из фильтра before)?
Спасибо!
Ответы
Ответ 1
Если вы вернете false из файла before_filter, выполнение запроса немедленно остановится.
Если вы просто заставляете свой метод login_required возвращать false (или перенаправлять), если они не вошли в систему, и заставить его возвращать true, если они есть, то просто before_filter :login_required
, он должен работать отлично.
Изменить: Как заявляет Lenry ниже, это не будет работать в Rails 2.0.1+ Вместо этого, чтобы остановить запрос, используйте head :ok
в своем коде
Ответ 2
В rails версии 2.0.1 и выше вам необходимо перенаправить или отправить ответ, чтобы остановить выполнение действия.
Из Agile Web Development с Rails Errata:
# 45840: неверно следующее:
"Если перед фильтром возвращается false, обработка цепочки фильтров завершается, и действие не выполняется. Фильтр также может отображать запросы вывода или перенаправления, и в этом случае исходное действие никогда не будет вызвано."
A before_filter не перестает обрабатывать цепочку фильтров on при возврате false больше.
Из примечаний к выпуску Rails 2.0.1: * Изменено before_filter прекращение, которое должно произойти автоматически при рендеринге или перенаправлении, но больше не возвращается просто false [David Heinemeier Hansson]
- Роб Кристи
redirect_to
, render
и head
остановят выполнение. Например, head :ok
ответит на запрос только кодом ответа OK OK, и действие не будет выполнено.
Ответ 3
Чтобы остановить цепочку обратного вызова в Rails 5, вы можете использовать
throw :abort