扩展 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 等)可以定义操作。
我有一个模块可以为 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 等)可以定义操作。