在RABL模板中访问子实例

时间:2012-05-24 02:06:20

标签: ruby-on-rails ruby rabl

我有一个RABL模板,如下所示

object @user
attributes :name
child :contacts do
  # does not work
  if contact.is_foo?
    attributes :a1, :a2
  else
    attributes :a3, :a4
  end
end

如何访问模板的Contact块中的child对象?我需要在子实例上执行一些条件逻辑。

4 个答案:

答案 0 :(得分:10)

您可以通过声明阻止参数来访问当前对象。

object @user
attributes :name
child :contacts do |contact|
  if contact.is_foo?
    attributes :a1, :a2
  else
    attributes :a3, :a4
  end
end

旧答案

我最终使用root_object method,它返回给定上下文中的数据对象。

object @user
attributes :name
child :contacts do
  if root_object.is_foo?
    attributes :a1, :a2
  else
    attributes :a3, :a4
  end
end

答案 1 :(得分:3)

保持干燥的另一种方法:

联系人/ show.json.rabl

object @contact
node do |contact|
    if contact.is_foo?
        {:a1 => contact.a1, :a2 => contact.a2}
    else
        {:a3 => contact.a3, :a4 => contact.a4}
    end
end

用户/ show.json.rabl

object @user
attributes :name
child :contacts do
    extends 'contacts/show'
end

答案 2 :(得分:1)

这是一种方式:

child :contacts do
  node(:a1, :if => lambda { |c| c.is_foo? }
  node(:a2, :if => lambda { |c| c.is_foo? }

  node(:a3, :unless => lambda { |c| c.is_foo? }
  node(:a4, :unless => lambda { |c| c.is_foo? }
end

不完全相同但只有一种可能性,另一种可能性是:

node :contacts do |u|
  u.contacts.map do |c|
    if contact.is_foo?
      partial("contacta", :object => c)
      # or { :a1 => "foo", :a2 => "bar" }
    else
      partial("contactb", :object => c)
      # or { :a3 => "foo", :a4 => "bar" }
    end
  end
end

答案 3 :(得分:0)

我知道这是一个迟到的回复,但遇到了类似的问题,所以想回答。

这更像是一个黑客但有效。

当两个变量用作块参数联系人和随机变量x时,contact指的是集合的对象

当在块参数中使用一个变量时,它会呈现集合对象

object @user
attributes :name
child :contacts do |contact, x|
  if contact.is_foo?
    attributes :a1, :a2
  else
    attributes :a3, :a4
  end
end