Ich habe einen Controller "UserController", der auf normale und Ajax-Anforderungen an http://localhost:3000/user/3
reagieren sollte.
Wenn es sich um eine normale Anforderung handelt, möchte ich meine Ansicht rendern. Wenn es sich um eine AJAX -Anforderung handelt, möchte ich JSON zurückgeben.
Der richtige Ansatz scheint ein respond_to do |format|
Block zu sein. Das Schreiben des JSON ist einfach, aber wie kann ich es dazu bringen, auf den HTML-Code zu antworten und die Ansicht einfach wie gewohnt zu rendern?
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
Nach meinem Wissen ist es nicht notwendig, show in "format.html" zu rendern, und sucht automatisch nach einer entsprechenden Aktionsansicht für ex: show.html.erb für HTML-Anforderung und show, js, erb für JS-Anforderung.
also das wird funktionieren
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
sie können auch überprüfen, ob die Anforderung ajax ist oder nicht, indem Sie request.xhr überprüfen. es gibt true zurück, wenn request ein ajax ist.
Ja, Sie können es in ändern
respond_to do |format|
format.html
format.json { render json: @user }
end
Der beste Weg, dies zu tun, ist genau wie Amitkumar Jha sagte, aber wenn Sie einen einfachen und schnellen Weg zum Rendern Ihrer Objekte benötigen, können Sie auch diese "Verknüpfung" verwenden:
def index
@users = User.all
respond_to :html, :json, :xml
end
Oder machen Sie respond_to
für alle Aktionen im Controller mithilfe von response_with:
class UserController < ApplicationController
respond_to :html, :json, :xml
def index
@users = User.all
respond_with(@users)
end
end
Ab der Version 4.2 von Rails 4.2 müssen Sie gem responder
verwenden, um mit respons_with arbeiten zu können.
Wenn Sie mehr Kontrolle benötigen und einige wenige Aktionen haben möchten, die sich anders verhalten, verwenden Sie immer einen vollständigen respons_to-Block. Sie können mehr hier lesen.