如何确定控制器操作是否已呈现(而不是重定向?)

Tom*_*man 12 ruby-on-rails

如果应用程序已重定向或呈现,则该performed?方法true在控制器中返回.

如何确定应用程序是否呈现(而不是重定向)?

performed?文档来看,我可以看一下@performed_render,但这看起来很糟糕.

编辑:我为什么要这样做?

我试图在它导致渲染(而不是重定向)的情况下缓存控制器动作的输出.这是我现在使用的代码:(基于渲染缓存)

  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
Run Code Online (Sandbox Code Playgroud)

pdo*_*obb 25

Rails 3.2+现在使用一种称为执行的方法用于确定是否已执行渲染或重定向.

举例:

def index
  redirect_to not_found_path unless authenticated?
  render action: "show_all" unless performed?
end
Run Code Online (Sandbox Code Playgroud)


Aug*_*aas 5

看看@performed_render.:)你没有解释为什么你需要检测这个,所以我无法建议替代解决方案.


ffo*_*oeg 5

在后置过滤器中,检查响应状态代码。

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
Run Code Online (Sandbox Code Playgroud)