Rails 5 API: пользовательский скрытый респондент, который будет обрабатывать значение, возвращаемое действием - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть приложение API на основе rails 5, использующее fast_jsonapi, и через некоторое время я наблюдаю, что все мои действия имеют один общий шаблон

  def action_name
    @some_object.perform_action_name # this returns @some_object
    render json: ControllerNameSerializer.new(@some_object).to_h
  end

Я не могу sh писать последняя строка render здесь, и она должна работать, для этого я хочу, чтобы возвращаемое значение действием обрабатывалось любым скрытым подобным респонденту предметом, класс Serializer можно разобрать, посмотрев на имя контроллера.

Возможно, этого можно достичь, добавив небольшое промежуточное программное обеспечение. Однако поначалу я нахожу это не очень хорошей идеей / практикой для go для промежуточного программного обеспечения. В промежуточном программном обеспечении мы получаем ответ, нам нужен хук до этого.

Я хотел бы представить, как

class SomeController ...
  respond_with_returned_value

  def action_name
    @some_object.perform_action_name # this returns @some_object
  end

Любые предложения?

Обратите внимание, не волнуйтесь Что касается ошибок / сбоев, @some_object.errors может их удерживать, и у меня есть механизм для обработки этого отдельно.

1 Ответ

1 голос
/ 04 апреля 2020

Набросал ...

class ApplicationController < ...
  def respond_with_returned_value
    include MyWrapperModule
  end
...
end

module MyWrapperModule
  def self.included(base)
    base.public_instance_methods.each do |method_name|
      original_method_name = "original_#{method_name}".to_sym
      rename method_name -> original_method_name
      define_method(method_name) { render json: send(original_method_name) }
    end
  end
end

Похоже, действительно должен быть какой-то благословенный способ сделать это - или, как будто кто-то уже сделал это.

...