我使用的是(私有)gem,它定义了Rails 5.2控制器。我想在提到的控制器中重写私有参数允许方法,以添加一些不同的参数。
我尝试引用Rails Engine Guide,但实际上并没有显示如何覆盖控制器方法(仅适用于模型,而该方法似乎不适用于控制器。)
更新:这是我根据上述Rails指南尝试过的装饰器模式。
/lib
文件夹是否也由Rails加载了?):# MyApp/lib/private_gem/engine.rb
module PrivateGem
class Engine < ::Rails::Engine
isolate_namespace PrivateGem
config.to_prepare do
Dir.glob(Rails.root + "app/decorators/**/*_decorator*.rb").each do |c|
require_dependency(c)
end
end
end
end
# MyApp/app/decorators/controllers/private_gem/users_controller_decorator.rb
PrivateGem::UsersController.class_eval do
private
# Only allow a trusted parameter "white list" through.
def user_params
params.require(:user).permit(:existing_param, :new_param)
end
end
我有一个不受欢迎的解决方案。首先,我加载现有的类,然后重新定义私有方法。
# MyApp/controllers/private_gem/users_controller.rb
load PrivateGem::Engine.root.join('app/controllers/private_gem/users_controller.rb')
PrivateGem::UsersController.class_eval do
private
# Only allow a trusted parameter "white list" through.
def user_params
params.require(:user).permit(:existing_param, :new_param)
end
end
这真的是最好的方法吗?也许它属于另一个地方?我应该以某种方式使用ActiveSupport::Concern
吗?在我看来,Rails似乎不是惯用的Rails,但我有很多东西要学习有关Rails的初始化方式以及Engine和Concerns的工作方式。
谢谢!