Reputation: 63547
I have a controller "UserController" that should respond to normal and ajax requests to http://localhost:3000/user/3
.
When it is a normal request, I want to render my view. When it is an AJAX request, I want to return JSON.
The correct approach seems to be a respond_to do |format|
block. Writing the JSON is easy, but how can I get it to respond to the HTML and simply render the view as usual?
def show
@user = User.find(params[:id])
respond_to do |format|
format.html {
render :show ????this seems unnecessary. Can it be eliminated???
}
format.json {
render json: @user
}
end
end
Upvotes: 58
Views: 105586
Reputation: 6620
The best way to do this is just like Amitkumar Jha said, but if you need a simple and quick way to render your objects, you can also use this "shortcut":
def index
@users = User.all
respond_to :html, :json, :xml
end
Or make respond_to
work for all the actions in the controller using respond_with :
class UserController < ApplicationController
respond_to :html, :json, :xml
def index
@users = User.all
respond_with(@users)
end
end
Starting from Rails 4.2 version you will need to use gem responder
to be able to use respond_with.
If you need more control and want to be able to have a few actions that act differently, always use a full respond_to block. You can read more here.
Upvotes: 0
Reputation: 29094
Yes, you can change it to
respond_to do |format|
format.html
format.json { render json: @user }
end
Upvotes: 22
Reputation: 1333
As per my knowledge its not necessary to "render show" in format.html it will automatically look for a respective action view for ex : show.html.erb for html request and show,js,erb for JS request.
so this will work
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
also, you can check the request is ajax or not by checking request.xhr? it returns true if request is a ajax one.
Upvotes: 107