Ruby on rails Rails5API:自定义隐藏响应程序,用于处理操作返回的值

Ruby on rails Rails5API:自定义隐藏响应程序,用于处理操作返回的值,ruby-on-rails,ruby-on-rails-5,rails-api,Ruby On Rails,Ruby On Rails 5,Rails Api,我有一个基于rails 5的api应用程序,使用fast\u jsonapi 过了一会儿,我发现我所有的行为都有一个共同的模式 def action_name @some_object.perform_action_name # this returns @some_object render json: ControllerNameSerializer.new(@some_object).to_h end 我不希望在这里写最后一行render,它应该可以工作,因为我希

我有一个基于rails 5的api应用程序,使用
fast\u jsonapi
过了一会儿,我发现我所有的行为都有一个共同的模式

  def action_name
    @some_object.perform_action_name # this returns @some_object
    render json: ControllerNameSerializer.new(@some_object).to_h
  end
我不希望在这里写最后一行
render
,它应该可以工作,因为我希望操作返回的值应该由任何隐藏的响应程序处理,类似的事情,可以通过查看控制器名称来确定序列化程序klass

也许这可以通过添加一个小型中间件来实现。然而,一开始,我发现使用中间件不是一个好主意/实践。在中间件中,我们确实得到了呈现的响应,在此之前我们需要一个钩子

我想你会喜欢的

class SomeController ...
  respond_with_returned_value

  def action_name
    @some_object.perform_action_name # this returns @some_object
  end
有什么建议吗

注意,不要担心错误/失败案例,
@一些对象。错误可能会保留它们,我有一个机制来单独处理。

勾勒出

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
类应用程序控制器<。。。
def用返回的值响应
包含MyWrapperModule
结束
...
结束
模块MyWrapperModule
def自带(基本)
base.public_instance_methods.each do| method_name|
原始方法名称=“原始方法名称”
重命名方法\u名称->原始方法\u名称
定义方法(方法名称){render json:send(原始方法名称)}
结束
结束
结束

似乎真的应该有一些幸运的方法来做到这一点——或者说一定有人已经做到了。

谢谢,这给了我一个线索,让我可以做一个非常相似的——我的样本在这里。我不会马上应用所有这些,我会等着看我的应用程序如何发展,同时我看到这迫使我遵循一些事情,比如没有自定义错误处理,总是将错误设置为AR对象错误,总是处理AR对象,关系或类似json的数据等。控制器现在看起来真的很薄,这让运行时变得不稳定——这可能是好的。我担心的事情:*在生产模式中使用此选项时,使用值而不是块可能会产生常量值,而不是动态值。*您可能希望将其中一些方法设置为私有/受保护,而不是公共。不要紧,但最好是安全的。