2011-08-23 9 views
5

C'è qualcosa di simile:RoR - Due formati responder con lo stesso blocco?

respond_to do |format| 

    format.html || format.xml do 
    #big chunk of code 
    end 

end 

vorrei farlo per il bene di DRY.

+0

modo quale formato si desidera che il blocco per tornare - HTML o XML? Puoi mettere tutta la logica al di fuori di respond_to e quindi solo formattarlo html/xml alla fine - ti aiuta? –

+0

Vedere http://stackoverflow.com/a/2430682/265940 per una risposta migliore utilizzando format.any (: html,: xml) {...} –

risposta

22

respond_to permette in realtà di specificare il vostro blocco comune per i diversi formati utilizzando qualsiasi:

format.any(:js, :json) { #your_block } 
+1

In realtà penso che questa sia l'unica vera risposta utile. Non sono riuscito a ottenere la risposta "Proc" in esecuzione e questo è decisamente più breve e più pulito. Tks! – fenton

+0

Inoltre, 'format.all' è un sinonimo di' format.any' se questo ha più senso per te. –

1

quando si

respond_to do |format| 
    format.html do 
    #block 
    end 
    format.xml do 
    #block 
    end 
end 

o

respond_to do |format| 
    format.html { #block } 
    format.xml { #block } 
end 

si sta approfittando di ruby blocks, che sono valutati come Procs. Quindi potresti fare

respond_to do |format| 
    bcoc = Proc.new do 
    # your big chunk of code here 
    end 
    format.html bcoc 
    format.xml bcoc 
end 

ma forse potresti spostare parte di quella logica nella tua struttura dati?

+0

Ty Alex, andrò con questa soluzione in quanto posso limitare il formato accesso .js al codice format.html/xml. – miligraf

+0

I blocchi ruby ​​non sono Proc. Possono essere convertiti avanti e indietro, ma non sono la stessa cosa. –

+0

@MatthewRatzloff La mia comprensione è che la sintassi del blocco è esattamente questa: la sintassi ruby ​​più comune per definire una chiusura. Vedi [https://gist.github.com/3757938](https://gist.github.com/3757938). Cosa sono allora? Felice di essere corretto. –

4

È possibile utilizzare un formato simile a questo:

class PeopleController < ApplicationController 
    respond_to :html, :xml, :js 

    def index 
    @people = Person.find(:all) 
    respond_with(@people) do |format| 
     format.html 
     format.xml 
     format.js { @people.custom_code_here } 
    end 
    end 
end 

Che sarebbe ottenere quello che stai cercando, se si dispone di una situazione che è più complessa fatemelo sapere. Vedi questo metodo article on the respond_with per ulteriore aiuto.

+0

Perdonami per aver risposto fino ad ora, il fatto è: voglio format.html e format.xml condividere lo stesso gruppo di codice, ma ho anche format.js che non voglio che abbia accesso per format.html's o format.xml's code (che in questo caso sarebbe lo stesso). – miligraf

+0

Utilizzare la versione modificata del codice sopra. Se avete domande fatemi sapere. –

Problemi correlati