Accessing the child instance in a RABL template

后端 未结 4 2063
不思量自难忘°
不思量自难忘° 2021-01-06 07:26

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
         


        
相关标签:
4条回答
  • 2021-01-06 07:36

    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
    
    0 讨论(0)
  • 2021-01-06 07:41

    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
    
    0 讨论(0)
  • 2021-01-06 07:45

    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
    
    0 讨论(0)
  • 2021-01-06 07:49

    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
    
    0 讨论(0)
提交回复
热议问题