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

Как определить, было ли выполнено действие контроллера (а не перенаправлено?)

Метод 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
4b9b3361

Ответ 1

Посмотрите @performed_render.:) Вы не объясняете, почему вам нужно это обнаружить, поэтому я не могу предложить альтернативные решения.

Ответ 2

Rails 3.2 + теперь использует метод выполненный? для определения того, уже ли рендеринг или перенаправление были выполнены.

Упрощенный пример:

def index
  redirect_to not_found_path unless authenticated?
  render action: "show_all" unless performed?
end

Ответ 3

В после фильтра проверьте коды для состояния ответа.

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