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

Как остановить выполнение контроллера рельсов?

У меня есть следующий фрагмент кода

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)?

Спасибо!

4b9b3361

Ответ 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