it-swarm.com.de

Rails: reply_to JSON und HTML

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

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. 

73
Amitkumar Jha

Ja, Sie können es in ändern

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

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.

0
Nesha Zoric