开发者

How can I determine whether a controller action has rendered (rather than redirected?)

The performed? method returns true in a controller if the application has redirected or rendered.

How can I determine whether the application rendered (rather than redirected)?

Judging from the performed? docs, I can look at @performed_render, but this seems hacky.

Edit: Why do I want to do this?

I'm trying to cache the output of a controller action only in the case that it results in a render (and not a redirect). Here's the code I'm using now: (based on 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


Rails 3.2+ now uses a method called performed? for determining whether or not a render or redirect has already been performed.

Contrived example:

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


Look at @performed_render. :) You don't explain why you need to detect this, so I am unable to suggest alternative solutions.


In an after filter, check the codes for the response status .

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜