Formato di output delle view con Rails

Salve a tutti,
sto prendendo in considerazione Rails per un’applicazione che devo
realizzare e al momento sto cercando una funzionalità in particolare:
la possibilità di alterare il formato di output della view (html, xml
o json) senza alterare il codice del controller.
In PHP usando lo Zend Framework mi basta aggiungere ?format=json o
?format=xml all’indirizzo attuale perché l’output passi
rispettivamente in json o xml.
È possibile ottenere la stessa cosa con Rails?
Grazie.

Giacomo.

Ciao,
in Rails puoi specificare il formato semplicemente aggiungendo .xml o
.json
poi nel controller selezioni il formato in questo modo

respond_to do |format|
format.html # index.html.erb se non metti niente viene renderizzata la
vie
predefinita
format.xml { render :xml => @aliquote_iva } # viene chiamato to_xml

aggiungi gli altri formati

end

Ciao

2008/11/29 Giacomo G. [email protected]

Quel codice che hai mostrato dovrei metterlo in ogni azione di ogni
controller?
Provo a spiegare un po’ meglio il problema: al momento in PHP ho un
controller tipo questo
class IndexController extends Zend_Controller_Action
{
public function fooAction() {
$this->view->foo = array(“gh1” => “asd”, “gh2” => “gh”);
}
}
Quando viene richiamato l’indirizzo http://blabla/index/foo/ sputa
fuori l’html (ovviamente passando per il layout della view), con
l’indirizzo http://blabla/index/foo/?format=json invece restituisce
direttamente i dati codificati in json. In questo modo non devo
scrivere codice specifico per un formato o per l’altro e il controller
resta separato dalla view (così volendo potrei sostituire
l’interfaccia ExtJS che sto scrivendo con una più normale view html
senza dover ritoccare il controller).
Insomma, posso fare in modo che un’azione usata per una view html tiri
fuori i dati in formato json senza doverla alterare in modo specifico?

2008/11/29 Pierpaolo S. [email protected]:

Vediamo se ho capito cosa ti serve.
In rails il tuo controller lo potresti scrivere così

class IndexController < ApplicationController
def foo
@foo = {:gh1 => “asd”, :gh2 => “gh”}
end
end

poi dovresti creare nella directory
app/views/index
la vista
foo.html.erb
questa risponde allindirizzo http://bla/index/foo
in seguito puoi aggiungere anche
foo.xml.erb
foo.json.erb

e risponderebbero rispettivamente a:
http://bla/index/foo.xml
http://bla/index/foo.json

Ciao

2008/11/29 Giacomo G. [email protected]

Ho provato a fare come dici, finché si tratta della view html tutto,
quando provo ad aprire il .json mi becco un:
No route matches “/index/foo.json” with {:method=>:get}
Che poi non capisco a cosa dovrebbe servire una view (foo.json.erb)
per restituire dati in formato json…

2008/11/29 Pierpaolo S. [email protected]:

Si hai ragione non ti avevo postato il codice che devi aggiungere nel
file
routes.rb
map.connect ‘:controller/:action.:format’
ti suggerisco di leggere alcune guide per capire meglio i meccanismi di
rails
http://guides.rubyonrails.org/getting_started_with_rails.html
questo è un tutorial di base
http://guides.rubyonrails.org/routing_outside_in.html
questo è sul routing
http://guides.rubyonrails.org/actioncontroller_basics.html
e uno sui controllers.

2008/11/29 Giacomo G. [email protected]

No non è fuori posto. Ci devi mettere questo dentro

<%= @foo.to_json %>

comunque io preferisco usare il respond_to.

class IndexController < ApplicationController
def foo
@foo = {:gh1 => “asd”, :gh2 => “gh”}

respond_to do |format|
  format.html # renderizza foo.html.erb
  format.xml {render :xml => @foo}
  format.json {render :json => @foo}
end

end
end

2008/11/30 Giacomo G. [email protected]

Ok, così funziona in effetti, grazie mille. Ora devo trovare il modo
per non dover creare N file .json.erb. :slight_smile:

2008/11/30 Pierpaolo S. [email protected]:

Giacomo G. wrote:

Ora devo trovare il modo per non dover creare N file .json.erb. :slight_smile:

Quando si usa il metodo render con le opzioni :xml o :json, le viste -
cioe’ i files .json.erb e .xml.erb - non sono necessarie.

Così effettivamente restituisce qualcosa ma non mi sembra per niente
json, è una semplice view html solo con estensione diversa (e infatti
il file foo.json.erb mi sembrava fuori posto).

2008/11/30 Pierpaolo S. [email protected]:

credo che si possa risolvere con un before_filter, ma dipende da
quante e quali azioni hanno i tuoi controller e da cosa va restituito
di volta in volta.