2012-03-06 11 views
34

Sto usando Rails 3.2, ho un modulo e voglio che venga pubblicato tramite ajax e che il controller restituisca json.Modulo remoto Rails 3: come specificare il tipo di contenuto?

Sto usando un aiutante form_for in questo modo:

= form_for(@object, :remote => true, :format => :json) do |f| 
.... 

mio controllo Crea oggetti metodo è simile al seguente:

def create 
    respond_to do |format| 
     if @object.save 
     format.html { redirect_to @object } 
     format.json { render json: @object, status: :created, location: @object } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @object.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

La forma sottopone ajaxly come previsto. Ma il controller sta restituendo html, non json!

Ispezionando la richiesta con firebug e l'intestazione http Content-Type sulla richiesta ajax è impostata su application/html.

La documentazione su questo argomento è piuttosto scarsa,: format =>: json sembra semplicemente aggiungere ".json" all'azione form, in realtà non modifica alcun header HTTP.

Ho anche provato: content_type =>: json a nessun effetto.

posso codice non semplicemente difficile il controller di tornare JSON in quanto vi sono altri luoghi in cui io vorrei tornare html ...

Quindi qualcuno sa come dire il controller di rendere JSON quando si utilizza form_for?

Grazie per qualsiasi aiuto

+0

Quale URL e il metodo viene reso nel tag form nella pagina? – iltempo

+0

Post, il tag completo è:

Chris

+0

No JSON qui. Hai preso in considerazione l'utilizzo di request.xhr? distinguere tra richieste ajax e richieste normali invece del formato richiesto? – iltempo

risposta

48

È possibile impostare il tipo di contenuto con:

= form_for(@object, :remote => true, :html => {:'data-type' => 'json'})

Come descritto nella rails.js linea 106.

+0

Grazie! Sapevo che mi mancava qualcosa di ovvio! :) – Chris

+16

In Rails 4 puoi usare 'format:: json' (o': format =>: json') invece di ': html => {: 'data-type' => 'json'}' –

+0

@JamesMcMahon In Rails 3.2 entrambi. – RocketR

0

Per Rails 5, il modo corretto è quello di impostare un attributo di dati data: { type: :json }.

JQuery UJS docs

+1

La risposta già esistente fornisce queste informazioni e altro ancora, per favore dedica ulteriore impegno a contribuire effettivamente alla domanda o alla risposta –

+0

Questo è un po 'pesante @DavyM.Stava solo cercando di aiutarmi e in realtà mi ha aiutato con il suo link ai documenti UJS. – EasyCo