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
似乎真的应该有一些好方法来做到这一点 - 或者好像有人已经做到了。
我有 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
似乎真的应该有一些好方法来做到这一点 - 或者好像有人已经做到了。