Rails: respond_to JSON and HTML

Ruby on-RailsRubyRuby on-Rails-4Respond To

Ruby on-Rails Problem Overview


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

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

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.

Solution 2 - Ruby on-Rails

Yes, you can change it to

respond_to do |format|
  format.html
  format.json { render json: @user }
end

Solution 3 - Ruby on-Rails

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDon PView Question on Stackoverflow
Solution 1 - Ruby on-RailsAmitkumar JhaView Answer on Stackoverflow
Solution 2 - Ruby on-RailsSanthoshView Answer on Stackoverflow
Solution 3 - Ruby on-RailsNesha ZoricView Answer on Stackoverflow