I have a module which adds some functionality to ActionController::Base. I have included it, and it works for some things. Specifically, UsersController.been_extended
returns true. If I override create in the UsersController, form_params
also works. The problem is that whenever I try to create a new user, it says that the action create could not be found for UsersController.
module RailsExtender
module ActionControllerExtension
extend ActiveSupport::Concern
def create
@obj = do_create
# more stuff here
end
private
def form_params
fields = self.model.fieldset({ 'create' => 'new', 'update' => 'edit' }.fetch(params[:action], params[:action]))
params.require(self.model.to_s.to_sym).permit(*fields)
end
module ClassMethods
def been_extended # just for testing purposes
true
end
end
end
end
ActionController::Base.send(:include, ActionControllerExtension)
And this is my controller which I'm trying to call create on.
module Auth
class UsersController < ApplicationController
@model = User
end
end
Why doesn't it think create exists?
Instead of monkey patching it into ActionController::Base like you do here:
Mix it into your ApplicationController like this:
My suspicion is that ActionController::Base is blacklisting all of its own methods for security reasons. Only subclasses of ActionController::Base (i.e. your ApplicationController, etc.) can define actions.