Rails 5 API:定制的隐藏响应程序,将处理操作返回的值

我有使用fast_jsonapi的基于Rails 5的api应用程序 一段时间后,我发现我所有的所有动作都有一种共同的模式

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

我不希望在这里写最后render行,它应该可以工作,因为我希望动作的返回值应该由任何隐藏响应者处理,例如: ,可以查看控制器名称来确定序列化器类别。

也许可以通过添加一个小的中间件来实现。但是,起初,我发现选择中间件不是一个好主意/实践。在中间件中,我们确实获得了渲染响应,在此之前我们需要一个钩子。

我想像

class SomeController ...
  respond_with_returned_value

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

有什么建议吗?

请注意,不必担心错误/失败的情况,@some_object.errors可以保留它们,我有一种机制可以单独处理该问题。

hank112 回答:Rails 5 API:定制的隐藏响应程序,将处理操作返回的值

草图...

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

似乎确实应该有一些有福的方法可以做到这一点-或好像有人必须已经做到了。

本文链接:https://www.f2er.com/2520822.html

大家都在问