In Rails, how do you render JSON using a view?
Suppose you're in your users controller and you want to get a json response for a show request, it'd be nice if you could create a file in your views/users/ dir, named show.json and after your users#show action is completed, it ren开发者_高级运维ders the file.
Currently you need to do something along the lines of:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json{
render :json => @user.to_json
}
end
end
But it would be nice if you could just create a show.json file which automatically gets rendered like so:
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
This would save me tons of grief, and would wash away that horribly dirty feeling I get when I render my json in the controller
You should be able to do something like this in your respond_to
block:
respond_to do |format|
format.json
render :partial => "users/show.json"
end
which will render the template in app/views/users/_show.json.erb
.
Try adding a view users/show.json.erb
This should be rendered when you make a request for the JSON format, and you get the added benefit of it being rendered by erb too, so your file could look something like this
{
"first_name": "<%= @user.first_name.to_json %>",
"last_name": "<%= @user.last_name.to_json %>"
}
As others have mentioned you need a users/show.json view, but there are options to consider for the templating language...
ERB
Works out of the box. Great for HTML, but you'll quickly find it's awful for JSON.
RABL
Good solution. Have to add a dependency and learn its DSL.
JSON Builder
Same deal as RABL: Good solution. Have to add a dependency and learn its DSL.
Plain Ruby
Ruby is awesome at generating JSON and there's nothing new to learn as you can call to_json
on a Hash or an AR object. Simply register the .rb extension for templates (in an initializer):
ActionView::Template.register_template_handler(:rb, :source.to_proc)
Then create the view users/show.json.rb:
@user.to_json
For more info on this approach see http://railscasts.com/episodes/379-template-handlers
RABL is probably the nicest solution to this that I've seen if you're looking for a cleaner alternative to ERb syntax. json_builder and argonaut, which are other solutions, both seem somewhat outdated and won't work with Rails 3.1 without some patching.
RABL is available via a gem or check out the GitHub repository; good examples too
https://github.com/nesquena/rabl
Just to update this answer for the sake of others who happen to end up on this page.
In Rails 3, you just need to create a file at views/users/show.json.erb
. The @user
object will be available to the view (just like it would be for html.) You don't even need to_json
anymore.
To summarize, it's just
# users contoller
def show
@user = User.find( params[:id] )
respond_to do |format|
format.html
format.json
end
end
and
/* views/users/show.json.erb */
{
"name" : "<%= @user.name %>"
}
Just add show.json.erb
file with the contents
<%= @user.to_json %>
Sometimes it is useful when you need some extra helper methods that are not available in controller, i.e. image_path(@user.avatar)
or something to generate additional properties in JSON:
<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>
This is potentially a better option and faster than ERB: https://github.com/dewski/json_builder
Im new to RoR this is what I found out. you can directly render a json format
def YOUR_METHOD_HERE
users = User.all
render json: {allUsers: users} # ! rendering all users
END
I'm just starting out with RoR, my apologies if it's not what you're looking for. I found this and this might be the most up-to-date straightforward method as described in https://guides.rubyonrails.org/v5.1/layouts_and_rendering.html#using-render
2.2.8 Rendering JSON
You don't need to call to_json on the object that you want to render. If you use the :json option, render will automatically call to_json for you.
All you need to do in your action is this
respond_to do |format|
format.html
format.atom
format.json { render json: @user }
end
And it renders your json response in ./users/1/custom_action.json
精彩评论