Reputation: 89223
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.
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
Upvotes: 14
Views: 7931
Reputation: 18037
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
Upvotes: 26
Reputation: 2336
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
Upvotes: 5
Reputation: 54593
Look at @performed_render
. :) You don't explain why you need to detect this, so I am unable to suggest alternative solutions.
Upvotes: 6