扩展 ActionController 仅部分适用于 ruby on rails

Extending ActionController only partially works in ruby on rails

我有一个模块可以为 ActionController::Base 添加一些功能。我已经包含了它,它对某些东西 有效 。具体来说,UsersController.been_extended returns 为真。如果我在 UsersController 中覆盖创建,form_params 也有效。问题是每当我尝试创建新用户时,它都会说找不到 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)

这是我的控制器,我正试图在其上调用创建。

module Auth
  class UsersController < ApplicationController
    @model = User
  end
end

为什么它认为 create 不存在?

而不是猴子把它修补成 ActionController::Base 就像你在这里做的那样:

ActionController::Base.send(:include, ActionControllerExtension)

像这样将其混合到您的 ApplicationController 中:

class ApplicationController < ActionController::Base
  include ActionControllerExtension
  # ...
end

我怀疑 ActionController::Base 出于安全原因将其所有方法列入黑名单。只有 ActionController::Base 的子类(即您的 ApplicationController 等)可以定义操作。