上下文敏感的JSON响应

时间:2012-01-09 22:47:49

标签: ruby-on-rails ruby-on-rails-3 json rest

我正在创建一个由RESTful json控制器组成的rails 3后端。例如。控制器看起来像这样:

respond_to :json

def index
  ...
  respond_with resources
end

...

这是由客户端上的jQuery使用的。一切都很好。

我的下一步是控制JSON,以便根据上下文不会序列化某些属性。例如。与仅具有读访问权限的人相比,资源所有者获得的财产数量更多。

我目前正倾向于Draper,并根据用户的角色为每个模型使用单独的装饰器。

我的问题是,这产生了很多样板。我目前也在使用cancan进行基于角色的授权。

有人能建议一种更好的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

我建议使用ActiveModel :: Serializer。见https://github.com/josevalim/active_model_serializers

为要公开的每个资源创建一个序列化程序。然后,您可以为每个模型分离序列化逻辑,轻松公开其他方法,并根据角色确定每个模型的范围。它适用于CanCan。

我喜欢这种语法,例如:

class MonkeySerializer < ActiveModel::Serializer
  attributes :name, :mom, :weight

  private

  # use this for a custom attribute not on the model
  def weight
    monkey.weight_in_pounds
  end    
end