Rails 5 API: 自定义隐藏响应器,将处理操作返回的值

Rails 5 API: custom hidden responder that would process value returned by the action

我有 rails 5 基于 api 的应用程序,使用 fast_jsonapi 过了一会儿,我发现我所有的大部分行为都有一个共同的模式

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

我不想在这里写最后 render 行,它应该可以工作,因为我希望操作返回的值应该由任何 hidden responder 之类的东西,Serializer klass 可以通过查看控制器名称来确定。

也许这可以通过添加一个小的中间件来实现。然而,起初,我发现使用中间件并不是一个好选择 idea/practise。在中间件中,我们确实得到了渲染响应,我们需要在此之前有一个钩子。

我想像

class SomeController ...
  respond_with_returned_value

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

有什么建议吗?

注意,不用担心 error/failure 个案例,@some_object.errors 可以处理它们,我有单独处理的机制。

画出草图...

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

似乎真的应该有一些好方法来做到这一点 - 或者好像有人已经做到了。