2014-07-14 11 views
8

Quando c'èIn che modo respond_to e respond_with funzionano nei binari?

def some_action 
    respond_to do |format| 
    format.html {} 
    format.js {} 
    format.json { respond_with @objects} 
    end 
end 

Sembra linea html e js la linea servire automaticamente/chiamare il file corrispondente nome dell'azione. E l'html e il js sono serviti l'uno o l'altro, non entrambi. È corretto?

Il jono viene chiamato se si ha una chiamata ajax nel js che è stato chiamato e richiede dati e questi hanno bisogno di dati con cui rispondere, giusto? Ho bisogno che risponda a json e a js, o solo a uno?

Se non si risponde a, e si omettono tutti i tipi, per impostazione predefinita risponde a html e a js?

Quando eseguo respond_to nel controller, anziché un reply_to block all'interno di ogni azione, si utilizza respond_with @objects per qualsiasi argomento (: thml,: js,: xml,: json, ecc.)?

sintassi alternativa:

class TheController < ApplicationController 

    respond_to :html, :js, :json, only: [:some_action, :other_action] 

    def some_action 
    respond_with @objects 
    end 
end 

Come funziona il sintassi alternativa?

Se si utilizza la sintassi alternativa, non si può rispondere in modo diverso a diversi tipi di richieste? Devi fare un reply_to block nonntead della sintassi alternativa se vuoi rispondere in modo diverso? In che modo ciascuno di questi casi risolve la graduale degradazione in html?

+4

Tutti i dettagli e le risposte alle tue domande sono qui http://apidock.com/rails/ActionController/MimeResponds/respond_with e qui http://apidock.com/rails/v4.0.2/ActionController/MimeResponds/respond_to – Benj

risposta

9

respond_with

Per una data azione di controllo, respond_with genera una risposta adeguata in base al tipo MIME richiesto dal cliente.

Ciò significa il controller invierà i dati appropriati su richiesta - per esempio, se hai fatto la seguente:

#app/controllers/articles_controller.rb 
Class ArticlesController < ApplicationController 
    def show 
     @article = Article.find params[:id] 
     respond_with @article 
    end 
end 

Questo sarebbe fondamentalmente rispondere con i dati da @article ogni volta che si invia una richiesta. Se la richiesta è nel tipo mime , tornerà come un oggetto JSON; se si tratta di una richiesta di HTML, tornerà con l'oggetto HTML sul show vista

-

respond_to

permette in sostanza di personalizzare le risposte specifiche ai diversi tipi MIME. Se si invia una richiesta JS, è possibile gestire la risposta JS ecc

respond_to blocchi all'interno delle azioni di controllo sono molto ingombranti, e veramente solo significato per specifiche modifiche/modifiche alla risposta stessa.

Un modo molto più semplice per gestire la respond_to è di dichiararla nella parte superiore del file di controllo, in sostanza dicendo Rails che ogni azione sarà utilizzare le opzioni definite in tale metodo:

#app/controllers/your_controller.rb 
Class YourController < ApplicationController 
    respond_to :js, :json, :html #-> the same as using respond_to block for each action 
end 
0

I casi di cui è necessario/non è necessario ogni riga format.*whatever*.

Normalmente non è necessario. Rails per impostazione predefinita cerca un file html (alias modello) che corrisponde al nome dell'azione nella cartella di visualizzazione che corrisponde al nome del controller.

Non sono sicuro di quando/perché json e html sono a volte associati insieme (come nel codice generato dallo scaffold). Forse la linea JSON è per i turbolinks (per favore conferma/correggi questo). Ma so che usi un blocco respond_to con vari tipi di righe di formato quando vuoi che ogni tipo si comporti in modo diverso (ad es. Serva fino a 10 risultati alla volta tramite js, ma più risultati tramite html).

Il formato js è necessario quando si utilizza remote: true in un modulo o collegamento. Questo perché usando questo telecomando: true disabilita la formattazione del template html e cerca invece un file js che corrisponda al nome dell'azione, ed esegue/restituisce quel file. In realtà non hai bisogno di rispondere alla linea JSON se stai facendo le cose solo in js.

Suggerimento: se i file js hanno js.erb, è possibile accedere alle variabili di istanza (per quanto riguarda le variabili locali? Per favore conferma/correggi questo) che hai impostato nella tua azione. Questo tipo di ha senso perché il tuo file *.js.erb è tecnicamente una vista. Le viste possono accedere alle sue variabili di azioni corrispondenti (hmm e quando le immagini vengono riprodotte da un altro controller?). Quindi, se hai già accesso alle variabili della tua azione nel tuo file js, questo può eliminare la necessità di effettuare chiamate jax o json call in molte situazioni.

In realtà non sono sicuro quando è necessaria la linea JSON quando si utilizza anche remote: true/javascript. chiamate di metodo jQuery.ajax() esplicite che vogliono che dati json possano giustificare l'uso della risposta a JSON.

Problemi correlati