Parametri tramite get e post

Salve,
mi scuso anzitempo per gli sciocchi dubbi, ma credo che all’inizio sia
normale.
Devo realizzare una cosa abbastanza semplice, ovvero scambio di messaggi
privati tra utenti.

Per farlo ho deciso quindi di crearmi uno scaffold per “users” ed uno
scaffold per “pms”. Ovviamente in user ho impostato “has_many”, in pm ho
impostato “belongs_to”.
Fin qui ok.

Il problema arriva ora: anzichè inserire manualmente l’id del ricevente
ho realizzato una piccola struttura che mi permette di vedere la lista
degli utenti, entrare nel profilo di un utente, cliccare un tasto “Send
PM” da cui vado nella pagina dei PM alla azione “New”.

Problema n°1:
i base lo scaffold per l’azione new vuole come azione una get e non
accetta parametri in ingresso (almeno è quello che leggo con un rake
routes). Ho quindi eliminato dal resource nel file route l’azione “new”
riscrivendola da solo per accettare un parametro tramite get.
Questa implementazione è giusta concettualmente? O c’è un modo più
veloce ed elegante?

Problema n°2:
nel caso la validazione andasse male ovviamente si viene rimandati alla
pagina new con l’elenco degli errori, ma l’id che mi ero portato dietro
si perde.
Come fare per recuperarlo o in alternativa inviarlo insieme al form
(sempre tramite get)?

Problema n°3:
NB: la tabella ha un campo, receiver_id, che io imposto tramite hidden
input nel form e un altro, sender_id che mi crea problemi perchè:
nel caso in cui tutto vada a buon fine (quindi per il momento non avrei
errori e quindi il problema 2 non bloccherebbe tutto) io riesco a
recuperare il sender_id, ma come lo uso?
L’istruzione @pm = Pm.new(params[:pm]) come la latero per accettare
anche un parametro @user.id che ho già ?

Grazie mille!

Credo che sia un problema molto comune quello di far fatica ad entrare
nell’ottica REST: un neofita dovrebbe approfondire la cosa il prima
possibile, perché è basilare per evitare di scrivere codice che diventa
subito spaghetti (sempre che non lo sia già da subito :slight_smile:

Secondo me è meglio modificare le specifiche/idea mentale che ci si è
fatti dell’applicazione pur di mantenere risorse e controller il più
RESTful possibili: semplicità e chiarezza a quel livello sono
impagabili, soprattutto se l’applicazione non è triviale ed è possibile
che continui ad evolversi nel tempo. Molte migliorie
all’interfaccia/usabilità dell’applicazione possono poi essere fatte
nelle viste e con progressive enhancement usando javascript, in modo da
rendere più piacevole e semplice l’uso dell’applicazione.

Il problema arriva ora: anzichè inserire manualmente l’id del ricevente
ho realizzato una piccola struttura che mi permette di vedere la lista
degli utenti, entrare nel profilo di un utente, cliccare un tasto “Send
PM” da cui vado nella pagina dei PM alla azione “New”.

Un approccio diverso che avrebbe salvato la struttura REST avrebbe
potuto essere mettere una select nella new del PM che listasse tutti i
possibili utenti destinatari. Certo, se fossero decine sarebbe una
soluzione pessima.
Oppure si potrebbe nestare la risorsa pm dentro receiver, in modo da
avere url del tipo

/receivers/1/pms/new

dove il receiver_id sarà sempre disponibile come params[:receiver_id],
in questo caso 1, mentre il sender immagino che sia l’utente loggato,
quindi sarà current_user se stai usando un sistema di autenticazione tra
i più famosi.

Ciao
Andrea


http://spaghetticode.it

Andrea L. wrote:

Credo che sia un problema molto comune quello di far fatica ad entrare
nell’ottica REST: un neofita dovrebbe approfondire la cosa il prima
possibile, perché è basilare per evitare di scrivere codice che diventa
subito spaghetti (sempre che non lo sia già da subito :slight_smile:

Secondo me è meglio modificare le specifiche/idea mentale che ci si è
fatti dell’applicazione pur di mantenere risorse e controller il più
RESTful possibili: semplicità e chiarezza a quel livello sono
impagabili, soprattutto se l’applicazione non è triviale ed è possibile
che continui ad evolversi nel tempo. Molte migliorie
all’interfaccia/usabilità dell’applicazione possono poi essere fatte
nelle viste e con progressive enhancement usando javascript, in modo da
rendere più piacevole e semplice l’uso dell’applicazione.

Il problema arriva ora: anzichè inserire manualmente l’id del ricevente
ho realizzato una piccola struttura che mi permette di vedere la lista
degli utenti, entrare nel profilo di un utente, cliccare un tasto “Send
PM” da cui vado nella pagina dei PM alla azione “New”.

Un approccio diverso che avrebbe salvato la struttura REST avrebbe
potuto essere mettere una select nella new del PM che listasse tutti i
possibili utenti destinatari. Certo, se fossero decine sarebbe una
soluzione pessima.
Oppure si potrebbe nestare la risorsa pm dentro receiver, in modo da
avere url del tipo

/receivers/1/pms/new

dove il receiver_id sarà sempre disponibile come params[:receiver_id],
in questo caso 1, mentre il sender immagino che sia l’utente loggato,
quindi sarà current_user se stai usando un sistema di autenticazione tra
i più famosi.

Ciao
Andrea


http://spaghetticode.it

Ciao Andrea e grazie dei consigli :-).
Ho ragionato un pochino sulla struttura REST e come fare per tenerla
aggiornata: in effetti ho notato che se la struttura pm fosse “dentro”
user avrei url per quella struttura composti come dici tu, ovvero:

/users/1/pms/new

il che permetterebbe di avere ordine nel codice e nella struttura. Vada
per la modifica ;-), anche perchè la lista utenti non è fattibile
essendo potenzialmente infiniti (è un progetto di prova senza
limitazioni di utenti).

In questo modo sia i problemi 1 e 2 vengono risolti, ma sai aiutarmi per
il 3? Cioè, dovendo creare un nuovo pm, di base l’istruzione che trovo è

@pm = Pm.new(params[:pm])

Come la altero per accettare anche un parametro current_user.id che ho
già ? Sai rimandarmi a qualche link particolare?
Ciao e grazie :slight_smile:

Marco P. wrote:

Per quanti avranno lo stesso mio problema (eseguire una create con dati
provenienti dal form e dall’url) ho risolto in questo modo:
l’url finale sarà qualcosa tipo /users/3/pms/new, da cui ricavo il
“sender_id”, e per salvare il tutto eseguo queste linee di codice:

params[:pm][:sender_id] = params[:user_id]
@pm = Pm.new(params[:pm])

Spero sia utile!

Attenzione, potrebbe essere pericoloso. Non ho capito se il “3” nel tuo
url si riferisce al mittente o al destinatario, ma se si riferisse al
primo un burlone ci metterebbe un secondo a taroccare il mittente dei
suoi messaggi, gli basterebbe modificare quel numero.
Risolvere è molto semplice: se il mittente è sempre l’utente loggato,
cosa che credo piuttosto probabile, per creare i messaggi non dovresti
settare l’id del mittente attraverso un parametro esterno come
params[:user_id] ma servirti di metodi tipo current_user.pms.build o
current_user.pms.create.
Se la cosa ti suonasse poco chiara o nuova ti consiglio di guardarti
bene le guide sia sul routing che su activerecord che trovi su
http://guides.rubyonrails.org/, e ci dovrebbe essere anche qualche
railscast sull’argomento credo.

Andrea

http://spaghetticode.it

Piccolo lapsus durante la scrittura: il mittente è ovviamente l’utente
loggato, il ricevente è dato dal parametro dell’url. :wink:

Per quanti avranno lo stesso mio problema (eseguire una create con dati
provenienti dal form e dall’url) ho risolto in questo modo:
l’url finale sarà qualcosa tipo /users/3/pms/new, da cui ricavo il
“sender_id”, e per salvare il tutto eseguo queste linee di codice:

params[:pm][:sender_id] = params[:user_id]
@pm = Pm.new(params[:pm])

Spero sia utile!

Come la altero per accettare anche un parametro current_user.id che ho
già ? Sai rimandarmi a qualche link particolare?

http://chncellphone.com/company-cases/China-cell-phone-wholesale