Переопределение метода контроллера драгоценного камня в Rails 5 - PullRequest
0 голосов
/ 02 ноября 2018

Я использую (приватный) гем, который определяет контроллер Rails 5.2. Я хочу переопределить метод разрешения частных параметров в упомянутом контроллере, чтобы добавить несколько других параметров.

Я попытался сослаться на Руководство по Rails Engine , но на самом деле оно не показывает, как переопределить метод контроллера (только модель, и тот же подход, похоже, не работает для контроллеров.)

Обновление : Вот пример шаблона декоратора, который я пробовал на основе вышеупомянутого руководства по 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 и как работают Engine и Concerns.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...