【问题标题】:ActiveModelSerializer with Sinatra带有 Sinatra 的 ActiveModelSerializer
【发布时间】:2014-11-07 08:50:48
【问题描述】:

我可以在 Sinatra 中使用active_model_serializers 吗?如果没有,有没有更好的方法在 Sinatra 中输出 json 来构建 Web 服务?

【问题讨论】:

  • 当然可以,它是纯红宝石,与 Rails 无关
  • 太棒了。我仍然不确定将 Sinatra 用于 Web 服务是否做出了正确的选择(我正在将我的应用程序的后端编写为服务),但我们会看到。
  • 好吧,为什么不呢,如果您开始有 50 多个端点,在 sinatra 中可能会更难组织,但是......为什么不呢
  • @apneadiving - 我认为 Sinatra 是要走的路。我创建了一个包含 60 个端点的 API。很容易组织。
  • @BS即使你知道 Rails 提供了很多免费、口味和颜色的安全性 :)

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


【解决方案1】:

是的,你可以。但是,AMS 的设计和架构非常关注 ActiveModel 实例,因此如果您不使用基于 ActiveModel 的库(例如 Mongoid、ActiveRecord 等),那么选择可能会大材小用。

不过,该方法反映了应用于 JSON 序列化的常见 Presenter 模式。您可以轻松创建自己的简单库,以从您传递的对象中提取您定义的属性。

Sinatra 还提供了一些JSON serialization 扩展。他们默认的做法是致电as_json。这不是最好的方法,也不是非常灵活,但您可以结合这两个元素来创建自己的解决方案,或者从头开始。

【讨论】:

  • 我将使用 ActiveRecord
【解决方案2】:

您可以在 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

【讨论】:

【解决方案3】:

我使用to_json 从 Sinatra API 返回 JSON 输出。事实证明,有几十个用于 Ruby 的 JSON gem,它们的效率各不相同。

一种方法是为要呈现为 JSON 的每个对象创建属性列表。例如,如果您的 User 有一张您不想渲染的图像,您可以为 User 类创建一个黑名单:

JSON_BLACKLIST = [ 'image' ]

然后,当你渲染 JSON 时,你可以调用:

user.attributes.reject{|a| JSON_BLACKLIST.include?( a )}.to_json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2014-10-05
    相关资源
    最近更新 更多