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
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.
Oui, vous pouvez le changer en
respond_to do |format|
format.html
format.json { render json: @user }
end
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 .