Forum: Italian Ruby user group Creare nuova view JSON

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.
28ef639de0d690812ce4e5ccf217868c?d=identicon&s=25 Saro V. (saro_v)
on 2015-12-23 11:19
Salve, mi sto dilettando a sperimentare con rails ma mi chiedevo quale
fosse il modo giusto per creare delle views in JSON.
In pratica dovrei creare una view show che mi dia tutti i campi di un
prodotto e le categorie associate oltre al venditore associato. Meglio
creare un nuovo controller e quindi delle nuove view o inserire una
nuova funzione nel controller del prodotto e una nuova view?

Tutto ciò perché vorrei poi con una singola chiamata ajax poter vedere i
dati ed eventualmente editarli.
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-12-23 20:37
Tante volte non in serve rispondere sia in html che in json alla stessa
url per cui di solito si fanno controller separati, magari con quello
json in un namespace API::NomeController. In questo modo si separano
anche le view json da quelle html e l'applicazione resta più ordinata.
Non credo però che sia altro che una preferenza. Io stesso in questo
momento ho un progetto con un controller che risponde in html a certe
azioni e in json ad altre. Aumentando le chiamate json però li separerò.
28ef639de0d690812ce4e5ccf217868c?d=identicon&s=25 Saro V. (saro_v)
on 2015-12-25 10:59
Si, infatti tengo molto all'ordine...per non impazzire in fase di
review. Ma mi chiedevo se cambiasse qualcosa in termini di prestazioni.
Magari avere solo risposte in Json e non in html migliora le
perfomance??
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-12-25 20:54
Le prestazioni del server quasi sicuramente migliorano perché la
dimensione del file JSON normalmente è inferiore a quella della pagina
html. Spetta poi al JavaScript sul client generare l'HTML. Nella mia
esperienza questo riduce le performance dello sviluppatore, a meno di
averne due (backend e frontend). Dipende da quello che è più importante
in un dato progetto.

Se le performance sono molto importanti: da prove che ho fatto, creare
le view JSON con jbuilder è più lento che generarle manualmente dentro
il controller. Se si vuole il massimo della velocità pare che si debbano
seguire vie un po' estreme come questa
https://dockyard.com/blog/2014/05/27/avoid-rails-w...
(ma occhio a
http://blog.2ndquadrant.com/postgresql-ctes-are-op...)
28ef639de0d690812ce4e5ccf217868c?d=identicon&s=25 Saro V. (saro_v)
on 2015-12-26 15:38
Grazie Paolo, ottimo aiuto.
Tralasciando l'articolo, che porta ad una alta ottimizzazione dei
passaggi da fare, mi pare di capire che nel mio caso rails
invia il risultato di ActiveRecord a jbuilder per creare le stringhe
JSON...aggiungendo un passaggio in più, corretto?
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-12-27 00:27
Corretto. Per json un po' articolati jbuilder è la cosa migliore, ma se
devi produrre solo un array ti conviene farlo direttamente nel
controller. Poi se devi staccar millisecondi, in ordine di fatica: 1)
usa pluck per fare una select dei soli campi che servono (si guadagna
sempre tanto), 2) non usare jbuilder, 3) bypassa del tutto AR, 4) la 2 e
la 3 insieme, 5) la bizzarria che ti linkavo.
28ef639de0d690812ce4e5ccf217868c?d=identicon&s=25 Saro V. (saro_v)
on 2015-12-28 13:46
Solo una cosa non mi è chiara...o forse più di una :D

Io ho dei locali, delle categorie e dei prodotti.

Le categorie sono associate ad un locale tramite place_id e i prodotti
sono associati ad una categoria tramite category_id.

In place voglio fare un render in JSON che mi dia tutte le info del
locale, le categorie associate e i prodotti associate alle categorie.

Sono riuscito a farmi dare le categorie in questo modo:

http://codepaste.net/wux3sf

Ma se volessi anche mostrare i prodotti?? Impossibile farlo da qui?
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2015-12-29 08:06
La tua view è

json.extract! @place, :id, :name, :address
json.categories @place.categories, :name

I prodotti sono associati alle categorie e non a @place, quindi nel
controller farei qualcosa del tipo

@products = Product.find(@place.categories.pluck(:id))

e nella view aggiungerei

json.products @products, :name

Standard disclaimer: non ho provato il codice, sarà sbagliato in 2 o 3
modi diversi, etc
28ef639de0d690812ce4e5ccf217868c?d=identicon&s=25 Saro V. (saro_v)
on 2016-01-12 12:46
ottimo, grazie mille.
Adesso sto cercando di eliminare jbuilder di mezzo.
Sto creando delle API implementando il versioning e sto cercando
qualcosa di appropriato per generare dei token da usare nel client ( che
poi è un'app per smartphone ).
This topic is locked and can not be replied to.