在Rails 5中覆盖gem的控制器方法

时间:2018-11-02 19:12:57

标签: ruby-on-rails ruby ruby-on-rails-5

我使用的是(私有)gem,它定义了Rails 5.2控制器。我想在提到的控制器中重写私有参数允许方法,以添加一些不同的参数。

我尝试引用Rails Engine Guide,但实际上并没有显示如何覆盖控制器方法(仅适用于模型,而该方法似乎不适用于控制器。)

更新:这是我根据上述Rails指南尝试过的装饰器模式。

  1. 加载装饰器(/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
  1. 装饰者:
# 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的工作方式。

谢谢!

0 个答案:

没有答案