web-dev-qa-db-fra.com

Rails: respond_to JSON et HTML

J'ai un contrôleur "UserController" qui devrait répondre aux demandes normales et ajax à http://localhost:3000/user/3.

Quand c'est une demande normale, je veux rendre ma vue. Lorsqu'il s'agit d'une demande AJAX, je souhaite renvoyer JSON.

La bonne approche semble être un bloc respond_to do |format|. Écrire le JSON est facile, mais comment puis-je le faire répondre au HTML et simplement restituer la vue comme d'habitude? 

  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
38
Don P

Selon mes connaissances, il n'est pas nécessaire de "rendre show" dans format.html, il recherchera automatiquement une vue d'action respective pour ex: show.html.erb pour une requête html et show, js, erb pour une demande JS.

alors ça va marcher

respond_to do |format|

  format.html # show.html.erb
  format.json { render json: @user }

 end

aussi, vous pouvez vérifier si la requête est ajax ou non en vérifiant request.xhr? elle retourne true si request est une requête ajax. 

73
Amitkumar Jha

Oui, vous pouvez le changer en

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

La meilleure façon de faire est comme Amitkumar Jha l'a dit, mais si vous avez besoin d'un moyen simple et rapide pour rendre vos objets, vous pouvez également utiliser ce "raccourci": 

def index
  @users = User.all
  respond_to :html, :json, :xml
end

Ou utilisez respond_to pour toutes les actions du contrôleur en utilisant respond_with:

class UserController < ApplicationController
  respond_to :html, :json, :xml

  def index
    @users = User.all
    respond_with(@users)
  end
end

À partir de la version 4.2 de Rails, vous devrez utiliser gem responder pour pouvoir utiliser respond_with.

Si vous avez besoin de plus de contrôle et que vous souhaitez avoir quelques actions qui agissent différemment, utilisez toujours un bloc respond_to complet. Vous pouvez en lire plus ici .

0
Nesha Zoric