Я использую (приватный) гем, который определяет контроллер Rails 5.2. Я хочу переопределить метод разрешения частных параметров в упомянутом контроллере, чтобы добавить несколько других параметров.
Я попытался сослаться на Руководство по Rails Engine , но на самом деле оно не показывает, как переопределить метод контроллера (только модель, и тот же подход, похоже, не работает для контроллеров.)
Обновление : Вот пример шаблона декоратора, который я пробовал на основе вышеупомянутого руководства по 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 и как работают Engine и Concerns.
Спасибо!