Accessing the child instance in a RABL template

依然范特西╮ 提交于 2019-12-19 04:04:13

问题


I have a RABL template as shown below

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

How do I access the Contact object in the child block of the template? I need to perform some conditional logic on the child instance.


回答1:


You can access the current object by declaring the block parameter.

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

Old answer

I ended up using the root_object method, which returns the data object in a given context.

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



回答2:


Another approach to keep things DRY:

contacts/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

users/show.json.rabl

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



回答3:


Here's one way:

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

Not exactly the same but one possibility, another is:

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



回答4:


I know it's a late reply but came across the similar problem so thought of answering.

It's more like a hack but works.

When two variables are used as block argument contact and a random variable x, contact refers to an object of the collection

When one variable is used in block argument, it renders collection object
object @user
attributes :name
child :contacts do |contact, x|
  if contact.is_foo?
    attributes :a1, :a2
  else
    attributes :a3, :a4
  end
end


来源:https://stackoverflow.com/questions/10730223/accessing-the-child-instance-in-a-rabl-template

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!