David
David

Reputation: 4455

how to append data to json in ruby/rails?

Say i have this short code:

item = Item.find(params[:id])
render :json => item.to_json

but i needed to insert/push extra information to the returned json object, how do i do that?

Lets say i need to insert this extra info:

message : "it works"

Thanks.

Upvotes: 24

Views: 39927

Answers (6)

Leandro Castro
Leandro Castro

Reputation: 558

I always use:

@item = Item.find(params[:id])
render json: { item: @item.map { |p| { id: p.id, name: p.name } }, message: "it works"  } 

Upvotes: 0

Stanley Shauro
Stanley Shauro

Reputation: 769

How to append data to json in ruby/rails 5

If you use scaffold, e.g.:

rails generate scaffold MyItem

in the view folder you will see next files:

app/view/my_item/_my_item.json.jbuilder
app/view/my_item/index.json.jbuilder

so, you can add custom data to json output for an item, just add this:

json.extract! my_item, :id, :some_filed, :created_at, :updated_at
json.url my_item_url(my_item, format: :json)    

json.my_data my_function(my_item)

As you can see, it's possible to modify as one item json output, as index json output.

Upvotes: 1

Steve
Steve

Reputation: 7098

I found the accepted answer now throws deprecation warnings in Rails 3.2.13.

DEPRECATION WARNING: You're trying to create an attribute message'. Writing arbitrary attributes on a model is deprecated. Please just useattr_writer` etc.

Assuming you don't want to put the suggested attr_writer in your model, you can use the as_json method (returns a Hash) to tweak your JSON response object.

item = Item.find(params[:id])
render :json => item.as_json.merge(:message => 'it works')

Upvotes: 8

Suprie
Suprie

Reputation: 117

Have you tried this ?

item = Item.find(params[:id]) 
item <<{ :status => "Success" }

render :json => item.to_json

Upvotes: -2

NM.
NM.

Reputation: 1929

The to_json method takes an option object as parameter . So what you can do is make a method in your item class called as message and have it return the text that you want as its value .

class Item  < ActiveRecord::Base
 def message
  "it works"
 end
end

render :json => item.to_json(:methods => :message)

Upvotes: 15

Dogbert
Dogbert

Reputation: 222060

item = Item.find(params[:id])
item["message"] = "it works"
render :json => item.to_json

Upvotes: 26

Related Questions