我有一个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
对象?我需要在子实例上执行一些条件逻辑。
答案 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