Forum: Italian Ruby user group Formato di output delle view con Rails

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Giacomo G. (Guest)
on 2008-11-29 14:33
(Received via mailing list)
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.
Pierpaolo S. (Guest)
on 2008-11-29 15:32
(Received via mailing list)
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. <removed_email_address@domain.invalid>
Giacomo G. (Guest)
on 2008-11-29 17:20
(Received via mailing list)
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. <removed_email_address@domain.invalid>:
Pierpaolo S. (Guest)
on 2008-11-29 19:35
(Received via mailing list)
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. <removed_email_address@domain.invalid>
Giacomo G. (Guest)
on 2008-11-29 22:53
(Received via mailing list)
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. <removed_email_address@domain.invalid>:
Pierpaolo S. (Guest)
on 2008-11-30 01:13
(Received via mailing list)
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...
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. <removed_email_address@domain.invalid>
Giacomo G. (Guest)
on 2008-11-30 01:55
(Received via mailing list)
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. <removed_email_address@domain.invalid>:
Pierpaolo S. (Guest)
on 2008-11-30 10:54
(Received via mailing list)
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. <removed_email_address@domain.invalid>
Giacomo G. (Guest)
on 2008-11-30 16:41
(Received via mailing list)
Ok, così funziona in effetti, grazie mille. Ora devo trovare il modo
per non dover creare N file .json.erb. :-)

2008/11/30 Pierpaolo S. <removed_email_address@domain.invalid>:
Claudio P. (Guest)
on 2008-12-03 14:34
Giacomo G. wrote:
> Ora devo trovare il modo per non dover creare N file .json.erb. :-)
>

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.
Pietro G. (Guest)
on 2008-12-03 15:24
(Received via mailing list)
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.
This topic is locked and can not be replied to.