2

I am building an API with Rails. The gems I use to build api are Grape and Rabl. I have done a lot of work but now I have to add status flag before all the json response from the api. How could I do this?

I have this .rabl file.

object @current_parent

attributes :first_name => :name
attributes :cell_phone => :mobile
attributes :email
attributes :address

node :day_care do |m| 
{ 
  :name     => current_day_care.name, 
  :address  => current_day_care.address, 
  :phone    => current_day_care.office_phone,
  :website  => current_day_care.website,
  :logo     => current_day_care.logo.url,
  :no_of_child => current_parent.relatives.count
}
end


child :relatives, :object_root => false do |m|
  child :child, :object_root => false do |n|
    attributes :id
    attributes :first_name      =>  :name
    attributes :gender
    attributes :student_stage   =>  :classroom
  end
end

This makes the the following output

{
"parent": {
    "name": "Devan",
    "mobile": "1234567891",
    "email": "testparent1@mail.com",
    "address": "762 Beahan Expressway",
    "day_care": {
        "name": "Brisa Erdman",
        "address": "859 Hermann Summit",
        "phone": "915.758.4580",
        "website": "fisher.info",
        "logo": "/uploads/day_care/logo/1/http%3A/example.com/ally",
        "no_of_child": 2
    },
    "relatives": [
        {
            "child": {
                "id": 1,
                "name": "Lucious",
                "gender": "t",
                "classroom": "PreKindergarten"
            }
        },
        {
            "child": {
                "id": 2,
                "name": "Lilly",
                "gender": "t",
                "classroom": "Toddlers"
            }
        }
    ]
}
}

But I want to have status flag in the beginning before the parent opens up like below

{
"status": "Success"
"parent": {
    "name": "Devan",
    "mobile": "1234567891",
    "email": "testparent1@mail.com",

But I cant figure out how to make this happen using rabl. Please guide me through this. If not possible provide an alternative solution.

mgs
  • 404
  • 4
  • 15

2 Answers2

2

take your current parent.rabl file, and use it as a partial in a new rabl template that expresses the status.

 object false
 node :parent do
    partial("parent", :object => @parent)
 end
 node :status  do
   @status
 end

then call this rabl file from your controller

blotto
  • 3,387
  • 1
  • 19
  • 19
  • This one works. Thanks a lot blotto. I have also figured out another way for this. Will post my answer too. – mgs Jun 19 '14 at 17:32
0

Thanks blotto for your answer. I figured out another solution for my problem and it seem to suite my situation ie not needed to create extra file and call the original parent.rabl as partial. This way my number of view files would be same. Have a look

Solution parent.rabl file

node do |u|
{
  :status => "Success"
}
end
child @current_parent do 

attributes :first_name => :name
attributes :cell_phone => :mobile
attributes :email
attributes :address

node :day_care do |m| 
{ 
  :name     => current_day_care.name, 
  :address  => current_day_care.address, 
  :phone    => current_day_care.office_phone,
  :website  => current_day_care.website,
  :logo     => current_day_care.logo.url,
  :no_of_child => current_parent.relatives.count
}
end

child :relatives, :object_root => false do |m|
  child :child, :object_root => false do |n|
    attributes :id
    attributes :first_name      =>  :name
    attributes :gender
    attributes :student_stage   =>  :classroom
  end
end 
end

By this way I get my desired result.

mgs
  • 404
  • 4
  • 15