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