2

У меня вопрос использования. В Rails 4.1, если вы запускаете метод контроллера и имеете redirect_to или визуализируете в какой-то момент вашего метода, вам по-прежнему разрешено продолжить выполнение в этой точке. Иногда это приводит к AbstractController :: DoubleRenderError, если вы неправильно обрабатываете поток управления. Почему это разрешено в Rails? Кажется, что забавный вариант использования для перенаправления и не остановить выполнение, когда это будет уместно?Почему рендеринг и перенаправление не прекращаются в приложении Rails?

Сообщение полная ошибка приведена ниже:

AbstractController::DoubleRenderError: 
     Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return". 
+1

Как уже упоминалось ниже, спросите Rails Core Team, они единственные, кто может дать авторитетный ответ на это. Пока они не говорят, мы не можем быть уверены. В общем Ruby вы можете нарушить выполнение с помощью 'return' или' throw' (или 'raise', но это для ошибок) и [это используется Sinatra] (http://www.sinatrarb.com/intro.html# Return% 20Values), поэтому он также оказался верным выбором. –

ответ

4

Фактически сообщение об ошибке говорит все:

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

Это поведение Rails по умолчанию.

Если вы попытаетесь отобразить более одного вида в одном действии, вы получите сообщение об ошибке AbstractController::DoubleRenderError.

Чтобы остановить выполнение после рендера, вы должны явно использовать инструкцию return.

+0

Справа, извините, я думаю, я оговорился. Я знаю, что ошибка существует и все, мне было просто интересно узнать, почему именно эта реализация существует. Например, не имеет смысла просто прекратить выполнение при рендеринге/перенаправлении вместо того, чтобы выбрасывать исключение? Почему Rails спроектирован так? – noname

+1

Да, это вопрос дизайна. Я думаю, что вы должны спросить, что в основной теме проблемы с рельсами;) –