与Sinatra的ActiveModel Serializer

时间:2014-11-07 08:50:49

标签: ruby-on-rails activerecord sinatra active-model-serializers rails-api

我可以将active_model_serializers与Sinatra一起使用吗?如果没有,是否有更好的方法让Sinatra的json输出用于构建Web服务?

3 个答案:

答案 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