Dubbi su REST


#1

Salve a tutti,

ho deciso tempo fa di imparare ad usare rails “the rest way”, visto che
mi pare che il team di rails stia davvero spingendo ad utilizzare questo
metodo.

Devo dire che mi piace come idea in generale, ma ancora mi rimane
qualche dubbio.

In particolare:

Ho cominciato a creare un’applicazione piuttosto grossa, e solo dopo il
sistema di gestione degli utenti (che è abbastanza articolata) e la
rispettiva parte amministrativa, mi sono trovato con un file di ruoting
enorme. Se penso che sono appena all’inizio del progetto la cosa mi
spaventa non poco. Significa forse che la mia applicazione è poco adatta
ad essere sviluppata con REST, o è normale finire con dei file di routes
enormi? Puo creare problemi di velocità la cosa?

Inoltre: mi capitava spesso prima di passare a REST di creare metodi che
gestiscono chiamate da link_to_remote per riempire dinamicamente parti
di form per esempio o contenuti dinamici. Ovviamente in alcuni casi si
tratta di chiamare un’azione standard ed eseguire del codice rispetto a
respond_to, ma altre volte non è possibile.
Mi sembra stupido creare un controller separato ogni volta che mi serve
un metodo del genere, e mi sembra altrettanto stupido creare delle
routes ad-hoc solo per gestire questi metodi. Come risolvete voi un
problema simile?

Grazie in anticipo per i chiarimenti


#2

probabilmente stai sbagliando a progettare la tua applicazione, poi
bisogna sempre vedere cosa intendi per enorme, grosso modo dovresti
avere almeno una definizione per controller(1 riga), di solito si
tende ad articolare di più le route, forse questo ti potrebbe aiutare,
nn riduci il codice ma diventa tutto piu chiaro.
dovresti avere delle routes di questo tipo

map.resources :trips, :member => { :itinerary => :get, :share
=> :post } do |trips|
trips.resources :geonames, :controller
=> :trip_geonames, :collection => { :autocomplete => :get }
end

come vedi puoi specificare molte cose e molti tipi di richiesta, get,
post, put, delete etc( questo dovrebbe rispondere alla tua seconda
domanda).

all’ inizio a dir il vero l’ approccio restful nn mi faceva
impazzire, mi sembrava di scrivere piu roba e incasinare tutto, il
fatto è che si, crei molti piuù controller, ma penso che proprio
grazie al fatto di suddividere la logica in un modo così ‘rigido’
porti ad un codice nettamente più chiaro(leggibile), l’ applicazzione
ha molto più senso. mi trovo ogni giorno a lavorare su più progetti
diversi, la maggior parte dei quali non iniziati da me e se non fosse
per restful passerei ore solo a capire cosa fa quella strana cosa con
ottimila righe di codice.

ah con restful riesci anche davvero a riutilizzare il codice delle
viste o cmq il codice in generale, sta tutto nell’ abituarsi a
ragionare restful.

per quanto riguarda link_to_remote ti consiglio prima di tutto di
usare ujs, cmq quel helper se nn sbaglio nn fa altro che creare una
form e fare il submit, quindi non vedo quale sia il problema, cosa
vorresti fare?

Q

On 23 Jan 2009, at 19:40, Simone G. wrote:

ad essere sviluppata con REST, o è normale finire con dei file di
routes
enormi? Puo creare problemi di velocità la cosa?


#3

Grazie per la tua risposta veloce.
Il vero problema non sono tanto le azioni ad-hoc come mi hai giustamente
mostrato, ma proprio il fatto di avere molti controller.
Esempio:

Per i miei utenti definisco i seguenti controller:

ProfilesController > Gestisce i profili
AvatarController > Gestisce l’upload di avatar nel profilo utente
ActivationsController > Gestisce l’attivazione
PasswordsController > Gestisce cambio o password dimenticata
EmailsController > Gestisce l’update email con attivazione
StateController > Gestisce il blocco/sblocco di utenti
RolesController > Gestisce i ruoli degli utenti

Ovviamente per ogni controller ho definito la route adatta, con tanto di
azioni ad-hoc come dal tuo esempio, e questa è solo una piccola parte di
quanto eseguo rispetto agli utenti, perchè sono appena all’inizio
(arriveranno cose come commenti, eventi, posts, iscrizioni, che sono
risorse di user ma anche risorse generiche dell’applicazione e della
parte admin).

Se calcoli che tutto questo va definito due volte (perchè la stessa
struttura va riutilizzata nell’admin namespace), direi che c’e’ gia
molta (troppa?) carne al fuoco in routes.rb .

Per link_to_remote, pensa all’azione che deve per esempio rispondere nel
caso voglio caricare una lista di stati rispetto alla nazione scelta in
un form. Dovrebbe essere qualcosa tipo: load_states


#4

On 23 Jan 2009, at 20:24, Simone G. wrote:

Grazie per la tua risposta veloce.
Il vero problema non sono tanto le azioni ad-hoc come mi hai
giustamente
mostrato, ma proprio il fatto di avere molti controller.
Esempio:

Per i miei utenti definisco i seguenti controller:

ProfilesController > Gestisce i profili
cosa intendi? dovresti usare la /users/show cambiando la vista o al
massimo ti fai un methodo users/account o se proprio ci tieni(magari
la tua gestione è particolarmente complessa) allora si fai un
controller profiles o accounts/

AvatarController > Gestisce l’upload di avatar nel profilo utente
questo ci vuole.

ActivationsController > Gestisce l’attivazione
users/activate, restful activation te lo mette gia nel controller,
devi solo crearti la route se non sbaglio

PasswordsController > Gestisce cambio o password dimenticata
puoi metterla nel profilo utente

EmailsController > Gestisce l’update email con attivazione
sempre parte di user, se non sbaglio sempre restful auth ti crea un
observer che invia mail.

StateController > Gestisce il blocco/sblocco di utenti
activa state machine(asm), è sempre parte di restful auth

RolesController > Gestisce i ruoli degli utenti
parte del modello utente

come vedi hai a mio avviso qualche errore nella progetazione, dovresti
capire meglio l’ approccio restful, se ti sistemi ste due cose inizi
già a vederne i benefici.

Se calcoli che tutto questo va definito due volte (perchè la stessa
struttura va riutilizzata nell’admin namespace), direi che c’e’ gia
molta (troppa?) carne al fuoco in routes.rb .

esatto hai un macello di controller con due righe di codice ognuno al
posto di avere due controller con 8 mila righe, ti garantisco che è
tutto molto ma molto piu chiaro.

in generale io creo un controller restful per ogni modello facendo
quansi per tutti la new, create, show update destroy etc, bene o male
sono operazioni base. poi volendo mi faccio anche altri controller che
lavorano sugli stessi modelli ma con route diverse, qui è un po più
complicato(non troppo).

Per link_to_remote, pensa all’azione che deve per esempio rispondere
nel
caso voglio caricare una lista di stati rispetto alla nazione scelta
in
un form. Dovrebbe essere qualcosa tipo: load_states

Posted via http://www.ruby-forum.com/.
map.resources :whatever, :collection => {:get_list => :get}

dovrebbe fare al caso tuo, collection fa una chiamata senza pretendere
l’ id dell’ oggetto su cui si dovrebbe basare il controller es /users/
search è una collection


#5

Ricorda anche la scorciatoria

map.resources :photos, :has_many => [:comments, :formats], :has_one
=> [:author]

equivalente a

map.resources :photos do |photos|
photos.resource :author
photos.resources :comments
photos.resources :formats
end

Quella di fatto di aiuta molto a rendere il routes.rb piu’ leggibile.


#6

Andrea C. wrote:

ProfilesController > Gestisce i profili
cosa intendi? dovresti usare la /users/show cambiando la vista o al
massimo ti fai un methodo users/account o se proprio ci tieni(magari
la tua gestione � particolarmente complessa) allora si fai un
controller profiles o accounts/
Ho questo controller perchè ho un modello UserProfile con relativo
database user_profiles, e va gestito sepratamaente rispetto all’account.

AvatarController > Gestisce l’upload di avatar nel profilo utente
questo ci vuole.

ActivationsController > Gestisce l’attivazione
users/activate, restful activation te lo mette gia nel controller,
devi solo crearti la route se non sbaglio
Difatti, non mi sto lamentando che devo creare il controller ma che
anche in questo caso si va a inserire una route in piu

PasswordsController > Gestisce cambio o password dimenticata
puoi metterla nel profilo utente
Ha diversi metodi ed ha senso che sia in un controller separato,
altrimenti dovrei specificare 4 azioni ad hoc per la risorsa
user_profile. Non si tratta solo di cambiare la password, si tratta di
generare un password token, rispedire l’utente al sito controllare il
token e spedirlo a una view dove puo cambiare la password. Certo potrei
fare una sola azione per tutto ma cosi tolgo complessit al controller e
ne aggiungo all’azione, non so cosa è peggio.

EmailsController > Gestisce l’update email con attivazione
Non serve ad inviare, ma a cambiare l’email in modo sicuro con
generazione di email token ecc…, anche qui ci sono diversi metodi e
view, difficile integrarlo in un’altro controller

StateController > Gestisce il blocco/sblocco di utenti
activa state machine(asm), � sempre parte di restful auth

RolesController > Gestisce i ruoli degli utenti
parte del modello utente
Mi serve una view che gestisce i ruoli per gli utenti e permette di
aggiungerne o toglierne

Non vorrei sepmbrare pesante ma se avessi potute evitare questi
controller mettendoli sotto altre azioni l’avrei fatto, ma come vedi
sono abbastanza obbligato ad averli. La cosa in realtà non mi crea
problemi, anzi, è solo la questione del file di routing enorme che mi
preoccupa.