In the continued saga that is the Rails 2.3.10 to Rails 3.0.1 upgrade, I found this little nugget today…you want to add a custom action to a controller that inherits from a Devise controller. Here are the steps that you need to follow:
1) Create a custom controller that overrides some out of the box Devise actions as well as adds a new method.
class RegistrationsController < Devise::RegistrationsController
def update
# do something different here
end
def deactivate_owner
# deactivate code here
end
end
2) You have to tell Devise to use the new controller in routes.rb as well as add the new route to the new action.
devise_for :owners, :controllers => { :registrations => "registrations" } do
post "deactivate_owner", :to => "registrations#deactivate_owner", :as => "deactivate_owner_registration"
end
When we initially implemented this, our route definition looked like this:
post "deactivate_owner", :to => "registrations#deactivate_owner", :as => "deactivate_owner_registration"
devise_for :owners, :controllers => { :registrations => "registrations" }
When it was implemented this way, we kept getting a AbstractController::ActionNotFound exception. Once we passed the block to devise_for seen in #2, everything worked fine.