Skip to content

Instantly share code, notes, and snippets.

@josevalim
Created June 26, 2010 11:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save josevalim/453984 to your computer and use it in GitHub Desktop.
Save josevalim/453984 to your computer and use it in GitHub Desktop.
# Customizing your Responder to always redirect to the collection path (index action).
# I did not test this (yet), but it probably is really close.
class AppResponder < ActionController::Responder
protected
# Overwrite navigation_behavior to redirect to the collection_location.
def navigation_behavior(error)
if get?
raise error
elsif has_errors? && default_action
render :action => default_action
else
redirect_to collection_location
end
end
# Returns the collection location for redirecting after POST/PUT/DELETE.
# This method, converts the following resources array to the following:
#
# [:admin, @post] #=> [:admin, :posts]
# [@user, @post] #=> [@user, :posts]
#
# This new arrays, when given to redirect_to, will generate the proper URL
# pointing to the index action.
#
# [:admin, @post] #=> admin_posts_url
# [@user, @post] #=> user_posts_url(@user.to_param)
#
def collection_location
return options[:location] if options[:location]
klass = resources.last.class
if klass.respond_to?(:model_name)
resources[0...-1] << klass.model_name.plural.to_sym
else
resources
end
end
end
# And now, just add it to your controller:
class ApplicationController < ActionController::Base
self.responder = AppResponder
end
@ncr
Copy link

ncr commented Jun 26, 2010

Thank you for the presentation yesterday. Didn't know about ActionController::Responder before.

@josevalim
Copy link
Author

My pleasure! :D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment