我可以将active_model_serializers与Sinatra一起使用吗?如果没有,是否有更好的方法让Sinatra的json输出用于构建Web服务?
答案 0 :(得分:1)
是的,你可以。但是,AMS的设计和体系结构强烈关注ActiveModel实例,因此如果您不使用基于ActiveModel的库(例如Mongoid,ActiveRecord等),则选择可能过度。
但是,该方法反映了应用于JSON序列化的常见Presenter模式。您可以轻松创建自己的简单库,以从您传递的对象中提取您定义的属性。
Sinatra还提供了一些JSON serialization扩展名。他们默认做的是致电as_json
。这不是最好的方法,它不是非常灵活,但你可以将这两个元素结合起来创建自己的解决方案,或者从头开始。
答案 1 :(得分:1)
你可以在lib文件夹中包含一个带有以下代码的json.rb,并且在你的application.rb上需要这个文件。
# lib/json.rb
module Sinatra
module JSON
def json(object, options={})
serializer = ActiveModel::Serializer.serializer_for(object, options)
if serializer
serializer.new(object, options).to_json
else
object.to_json(options)
end
end
end
end
只使用
get '/foo' do
json Foo.find(params[:id])
end
get '/bar' do
json Bar.find(params[:id]), { scope: self }
end
答案 2 :(得分:0)
我使用to_json
从Sinatra API返回JSON输出。事实证明,Ruby有许多JSON宝石,效率各不相同。
一种方法是为要渲染为JSON的每个对象创建属性列表。例如,如果您的用户有一个您不想渲染的图像,则可以为User类创建一个黑名单:
JSON_BLACKLIST = [ 'image' ]
然后,当您渲染JSON时,您可以调用:
user.attributes.reject{|a| JSON_BLACKLIST.include?( a )}.to_json