Ответ 1
Посмотрите @performed_render
.:) Вы не объясняете, почему вам нужно это обнаружить, поэтому я не могу предложить альтернативные решения.
Метод performed?
возвращает true
в контроллер, если приложение перенаправлено или отображено.
Как определить, будет ли выполняемое приложение (а не перенаправлено)?
Судя по документам performed?
, я могу посмотреть @performed_render
, но это кажется взломанным.
Я пытаюсь кэшировать вывод действия контроллера только в том случае, если он приводит к рендерингу (а не к переадресации). Здесь код, который я использую сейчас: (на основе render-caching)
def render_with_cache(options = {})
key = ([request.request_uri, request.format] | (options.delete(:key_additions) || [])).join("::")
body = Rails.cache.read(key)
if body
render :text => body
else
yield if block_given?
render unless performed?
if @performed_render
Rails.cache.write(key, response.body, options) # :expires_in
end
end
end
Посмотрите @performed_render
.:) Вы не объясняете, почему вам нужно это обнаружить, поэтому я не могу предложить альтернативные решения.
Rails 3.2 + теперь использует метод выполненный? для определения того, уже ли рендеринг или перенаправление были выполнены.
Упрощенный пример:
def index
redirect_to not_found_path unless authenticated?
render action: "show_all" unless performed?
end
В после фильтра проверьте коды для состояния ответа.
MyController < ActionController
after_filter :check_response
# define your actions that render or redirect
protected
def check_response
# put real app logic here
puts :rendered! if response.status == "200 OK"
puts :redirected! if response.status == "302 Found"
end
end