根据rabl的情况排除一些孩子

时间:2014-03-30 19:06:50

标签: ruby-on-rails ruby rabl

我已经完成了其他类似的问题,不幸的是,似乎没有什么能帮助我解决问题。

我试图使用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"。有没有办法解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:1)

docs表示您可以将子对象传递给块,如下所示:

child :links, :root => :edges, :object_root => :datas do |child|
  unless child.child_id.nil?
    ...
  end
end

(在文档中搜索"您也可以传入当前对象")。