我已经完成了其他类似的问题,不幸的是,似乎没有什么能帮助我解决问题。
我试图使用rabl来生成我的JSON,但是如果我需要一个子对象的任何属性为nil,我想跳过那个孩子。我的原始模板看起来像
child :links, :root => :edges, :object_root => :datas do
node(:id) { |link| link.id.to_s() }
node(:source) { |link| link.parent_id.to_s() }
node(:target) { |link| link.child_id.to_s() }
end
我一直试图弄清楚如何排除事物。所以,如果我有
child :links, unless: lambda{|l| l.child_id == nil || l.parent_id == nil},:root => :edges, :object_root => :datas do
node(:id) { |link| link.id.to_s() }
node(:source) { |link| link.parent_id.to_s() }
node(:target) { |link| link.child_id.to_s() }
end
我得到"未定义的child_id for Work ..."作为一个错误。显然,即使它在儿童宣言中,它仍然指的是父母。我尝试将该代码移动到一个单独的文件中并包含它,并收到相同的错误。使用if语句也有同样的问题。
然后我尝试了
child :links, :root => :edges, :object_root => :datas do
node(:id, unless: lambda{|l| l.child_id == nil || l.parent_id == nil} ) { |link| link.id.to_s() }
node(:source, unless: lambda{|l| l.child_id == nil || l.parent_id == nil}) { |link| link.parent_id.to_s() }
node(:target, unless: lambda{|l| l.child_id == nil || l.parent_id == nil}) { |link| link.child_id.to_s() }
end
但这给了我{"数据":{}},这是我不想要的。如果条件失败,我根本不需要任何东西。
根据Accessing the child instance in a RABL template中的一些回复,我尝试了
child :links, :root => :edges, :object_root => :datas do
if root_object.child_id == nil
node(:id) { |link| link.id.to_s() }
node(:source) { |link| link.parent_id.to_s() }
node(:target) { |link| link.child_id.to_s() }
end
end
收到"未定义的方法`child_id' for #ActiveRecord :: Associations :: CollectionProxy :: ActiveRecord_Associations_CollectionProxy_Link"
我觉得这很难做到。基本上,如何在此循环的每个步骤中引用单个子元素?这样我才能真正检查并忽略它。这是rabl-rails的问题吗?
编辑:
因此,在阅读https://github.com/nesquena/rabl/issues/367后,我尝试了以下内容:
#works.rb
def valid_links
links = self.links.select {|l| l.parent_id != nil && l.child_id != nil}
return links
end
#works/show.json.rabl
child :valid_links => "edges" do
node(:id) { |link| link.id.to_s() }
node(:source) { |link| link.child_id.to_s() }
node(:target) { |link| link.parent_id.to_s() }
end
这几乎正常。但是,我需要定义object_root和root。我只是通过设置valid_links来指向我需要的东西,但是每当我尝试定义object_root时,我得到了"未定义的方法`id' for [:valid_links," links"]:Array"。有没有办法解决这个问题?
感谢。
答案 0 :(得分:1)
docs表示您可以将子对象传递给块,如下所示:
child :links, :root => :edges, :object_root => :datas do |child|
unless child.child_id.nil?
...
end
end
(在文档中搜索"您也可以传入当前对象")。