扩展ActionController仅部分在rails上的ruby中工作

时间:2015-06-26 01:41:46

标签: ruby-on-rails ruby inheritance actioncontroller

我有一个模块,它为ActionController :: Base添加了一些功能。我已将其包含在内,并且可用于某些事情。具体来说,UsersController.been_extended返回true。如果我在UsersController中覆盖create,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)

这是我的控制器,我试图调用create。

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

为什么认为创造不存在?

1 个答案:

答案 0 :(得分:1)

而不是像在这里一样将猴子修补到ActionController :: Base中:

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

将它混合到您的ApplicationController中,如下所示:

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

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