如何在ActiveModel串行器阵列中跳过对象?

时间:2014-11-18 23:10:35

标签: json ruby-on-rails-4 active-model-serializers

我搜索了所有有效的模型序列化器(v 0.9.0)文档以及我能找到的SO问题,但无法弄清楚这一点。

我有可以标记为“已发布”或“草稿”的对象。如果未发布它们,则只有创建该对象的用户才能看到它。我显然可以在我的控制器中为“show”设置权限,但我也想从json删除这些对象,我的“index”操作返回,除非它是正确的用户。有没有办法从序列化程序返回的json中删除此对象?

在我的activemodel序列化程序中,我能够使用过滤器(键)和重载属性来删除数据,如下面的代码所示,但我不能只删除整个对象(我不得不返回我的json中的空{},尝试返回nil打破序列化程序)。

我可能错过了一些简单的事情。任何帮助将不胜感激!

class CompleteExampleSerializer < ExampleSerializer

  attributes :id, :title
  has_many :children

  def attributes
     data = super
     (object.published? || object.user == scope || scope.admin?) ? data : {}
  end 

  def filter(keys)
    keys = super
    (object.published? || object.user == scope || scope.admin?) ? keys : {}
  end
end

2 个答案:

答案 0 :(得分:0)

看起来不错,当你不想要任何键时,尝试返回数组而不是哈希。此外,我不认为调用超级是必要的b / c过滤器接收密钥。

另外,我不认为定义属性方法是必要的。

答案 1 :(得分:0)

我有章节可以发表或未发表。他们归故事所有,所以我结束了下面的事情。

has_many :unpublished_chapters, -> { where published: false }, :class_name => "Chapter", dependent: :destroy
has_many :published_chapters, -> { where published: true }, :class_name => "Chapter", dependent: :destroy

在我的序列化程序中,只有当current_user是这些章节的所有者时,才选择包含unpublished_chapters。在ams 0.8.0中语法是这样的。

def include_associations!
  include! :published_chapters if ::Authorization::Story.include_published_chapters?(current_user,object,@options)
  include! :unpublished_chapters if ::Authorization::Story.include_unpublished_chapters?(current_user,object,@options)
end

在我的情况下,区分这两者并不是那么糟糕,它省去了在客户端处理它的麻烦。我们的情况类似,但是你想通过访问章节索引路径获得所有章节。这在我的应用程序中没有多大意义,但您可以转到该控制器并在该表上呈现查询。