Ruby Forum Italian Ruby user group > Popolare partial attraverso link_to

Posted by Matteo Buferli (Guest)
on 22.04.2008 22:17
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Ciao a tutti,
preso questo codice

<h1>Scheda Paziente</h1>
<%= debug(@patient) %>
<%= debug(@vaccines) %>

<%= render :partial => 'vaccines/all' %>

<%= link_to "Popola Vaccines" ,  $$$ %>

dove in _all non faccio nient'altro che stampare il contenuto di 
@vaccines.

Alla prima vista @vaccines e' vuoto, ma cliccando su popola vaccines,
vorrei che si mandasse a un metodo (che non modifichi nulla) e che
faccia Vaccine.find(:all).
E' banale ma non riesco: io ho definito nel controller un metodo (ogni
def del controller deve avere per forza una vista) che fa cio', ma dopo
il click lui cerca di andare a /controller/def e non va bene, deve
semplicemente scrivere in quella variabile e basta.

Attendo ansiosamente
- --
Matteo Buferli
WEB: http://www.buferli.com
PGP FINGERPRINT: B7C9 BE0A F77F 4747 56A2 87EC F6E5 8A01 65BB 58C1
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFIDkes9uWKAWW7WMERAtR7AJ0WQYESnFP+eZ6BLR3wcssi/fZF/QCeNi5d
9OPC2AriYreoP1WMbeKzhyE=
=V/Q+
-----END PGP SIGNATURE-----
Posted by maner never (maner)
on 23.04.2008 12:01
Matteo Buferli wrote:
> ...
> <h1>Scheda Paziente</h1>
> <%= debug(@patient) %>
> <%= debug(@vaccines) %>
> <%= render :partial => 'vaccines/all' %>
> <%= link_to "Popola Vaccines" ,  $$$ %>
> 
> dove in _all non faccio nient'altro che stampare il contenuto di 
> @vaccines.
> Alla prima vista @vaccines e' vuoto, ma cliccando su popola vaccines,
> vorrei che si mandasse a un metodo (che non modifichi nulla) e che
> faccia Vaccine.find(:all).
> E' banale ma non riesco: io ho definito nel controller un metodo (ogni
> def del controller deve avere per forza una vista) che fa cio', ma dopo
> il click lui cerca di andare a /controller/def e non va bene, deve
> semplicemente scrivere in quella variabile e basta.
> 
> Attendo ansiosamente

Alla fine del tuo nuovo metodo, puoi far renderizzare di nuovo la stessa 
pagina, tramite un
 render :action=>'<nome vista Scheda Paziente>'

Ti rimarrebbe pero' il link inutile "Popola Vaccines", che potresti non 
visualizzare se @vaccines e' valorizzato ( dovrebbe esistere un metodo 
link_to_unless )

In alternativa, puoi usare AJAX, sostituendo il "<%= render :partial => 
'vaccines/all' %>" con un div (es <div id='vaccines' />) ed il link_to 
con un link_to_remote (specificando :update=>'vaccines'). La tua azione, 
in questo caso, dopo aver valorizzato @vaccines, dovra' renderizzare la 
lista dei vaccini (puoi rinominare vaccines/_all.erb.html in 
vaccines/all.erb.html e utilizzare questa view)

Ciao
 Massimo
Posted by Matteo Buferli (Guest)
on 23.04.2008 17:09
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

maner never wrote:
>> Alla prima vista @vaccines e' vuoto, ma cliccando su popola vaccines,
> pagina, tramite un
>  render :action=>'<nome vista Scheda Paziente>'
> 

Innanzitutto grazie mille per la risposta, ma mi sono rimasti ancora
alcuni dubbi:

il metodo che fa

def popola
  @vaccines = Vaccine.find :all
  render :action => paziente (la pagina attuale e' paziente.html.erb)
end

dove lo devo scrivere? io ho provato nel controller dove ho definito il
metodo paziente, ma lui cerca di accedere a
  /controller/popola
e mi ritorna errore.

> 
> Ciao
>  Massimo
> 


- --
Matteo Buferli
WEB: http://www.buferli.com
PGP FINGERPRINT: B7C9 BE0A F77F 4747 56A2 87EC F6E5 8A01 65BB 58C1
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFID1Du9uWKAWW7WMERAm4wAJ0XffjiHrGz3OtuLr6itn33akAp2QCcDS/5
cHBq6nwddeI8xtgFYA7Kl8Q=
=j/Nx
-----END PGP SIGNATURE-----
Posted by maner never (maner)
on 23.04.2008 17:27
Matteo Buferli wrote:
>...
> Innanzitutto grazie mille per la risposta, ma mi sono rimasti ancora
> alcuni dubbi:
> 
> il metodo che fa
> 
> def popola
>   @vaccines = Vaccine.find :all
>   render :action => paziente (la pagina attuale e' paziente.html.erb)
> end
> 
> dove lo devo scrivere? io ho provato nel controller dove ho definito il
> metodo paziente, ma lui cerca di accedere a
>   /controller/popola
> e mi ritorna errore.
> 
Si, va bene nello stesso controller.che suppongo cosi:

class PazientiController < ApplicationController
  def paziente
  end

  def popola
    @vaccines = Vaccine.find :all
    render :action => 'paziente'
  end
end

Il problema mi sa che e' nel tuo strano link_to, con $$$ come parametro

Prova a cambiarlo cosi':
<%= link_to "Popola Vaccines" ,  :action=>'popola' %>






Posted by Carmine Moleti (carminem)
on 23.04.2008 18:06
Ciao Matteo,

Fermo restando gli ottimi suggerimenti già ricevuti,
potresti incapsulare il rendering dei vaccini in un helper


<h1>Scheda Paziente</h1>
<%= debug(@patient) %>
<%= debug(@vaccines) %>

<%= show_vaccines(@patient, @vaccines) %>

L'helper sarebbe scritto così:

def show_vaccines(patient = nil, vaccines = nil)

  if !patient.nil? and !vaccines.nil?
    render :partial => ...
  else
    link_to "Popola Vaccines", :action => "popola"
  end

end

Qualora, come presumo (in questo caso, quale sarebbe l'utilità 
dell'action "popola"?), ci fosse una relazione tra Patient e Vaccine,
l'helper avrebbe un unico parametro (il Patient).

L'action nel controller rimarrebbe come negli altri suggerimenti.

Spero di non aver detto fesserie e di essere stato utile.

Saluti,
Carmine
Posted by Matteo Buferli (Guest)
on 23.04.2008 18:20
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Carmine Moleti wrote:
> <%= show_vaccines(@patient, @vaccines) %>
> end
> 
> Qualora, come presumo (in questo caso, quale sarebbe l'utilità 
> dell'action "popola"?), ci fosse una relazione tra Patient e Vaccine,
> l'helper avrebbe un unico parametro (il Patient).
> 
> L'action nel controller rimarrebbe come negli altri suggerimenti.
> 
> Spero di non aver detto fesserie e di essere stato utile.
> 
> Saluti,
> Carmine

Grazie ancora a tutti, ora provo subito.

Ti spiego la mia popola: patient e' in relazione 'molti a molti' con
vaccine.
Sto facendo un form dove e' possibile eventualmente aggiungere un
vaccino, ma siccome reputo inutile caricare tutti i possibili vaccini se
non si vuole esplicitamente aggiungere un vacino, sto cercando un
sistema che con un pulsante, riempa questa variabile definita come [] di
base.

Ora comunque provo le varie soluzione, se riscontro altri problemi mi
affido alla vostra grande esperienza e generosita'.

Grazie a tutti veramente.
Buona serata.
- --
Matteo Buferli
WEB: http://www.buferli.com
PGP FINGERPRINT: B7C9 BE0A F77F 4747 56A2 87EC F6E5 8A01 65BB 58C1
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFID2G19uWKAWW7WMERAsPZAJ9OpNiTea5T8YwvJTkMSooeEhilhwCfRc8a
TUfv3UcWW+vDAV7U296OaKs=
=JNfw
-----END PGP SIGNATURE-----
Posted by Matteo Buferli (Guest)
on 23.04.2008 18:30
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

maner never wrote:
>> end
>>
>> dove lo devo scrivere? io ho provato nel controller dove ho definito il
>> metodo paziente, ma lui cerca di accedere a
>>   /controller/popola
>> e mi ritorna errore.
>>
> Si, va bene nello stesso controller.che suppongo cosi:
> 
> class PazientiController < ApplicationController
>   def paziente
  @vaccines = []
  @patient = Patient.find(params[:id])
> Prova a cambiarlo cosi':
> <%= link_to "Popola Vaccines" ,  :action=>'popola' %>
> 

Si con $$$ intendevo qualcosa di generico, perche' non sapevo se potevo
metterlo nello stesso controller.

Ho notato che cosi facendo, dopo aver chiamato popola e aver
renderizzato paziente, perdo la variabile @patient nella "nuova" 
paziente.

Ti ho editato il codice per farti capire come sono strutturate i miei
metodi.

Altra domanda, non posso in quel link_to fare si che richiami un metodo
definito nel model Vaccine ad esempio che prenda quella variabile e la
riempa al click? se si come posso fare per dire a link_to di chiamare un
metodo definito nel model di una classe su una data variabile??

Grazie ancora per la gentilezza.

Saluti.
- --
Matteo Buferli
WEB: http://www.buferli.com
PGP FINGERPRINT: B7C9 BE0A F77F 4747 56A2 87EC F6E5 8A01 65BB 58C1
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFID2QB9uWKAWW7WMERAgHYAJ42ZSxCxzJBBCaKhehtBiszMiX8ZACfSGp4
gDYiIxCIeh2NahLwHQiSAiw=
=hBph
-----END PGP SIGNATURE-----
Posted by maner never (maner)
on 23.04.2008 22:14
> Ho notato che cosi facendo, dopo aver chiamato popola e aver
> renderizzato paziente, perdo la variabile @patient nella "nuova" 
> paziente.
> 
> Ti ho editato il codice per farti capire come sono strutturate i miei
> metodi.
> 
> Altra domanda, non posso in quel link_to fare si che richiami un metodo
> definito nel model Vaccine ad esempio che prenda quella variabile e la
> riempa al click? se si come posso fare per dire a link_to di chiamare un
> metodo definito nel model di una classe su una data variabile??

Rispondo di fretta. Cosi' dovrebbe funzionare

<%= link_to "Popola Vaccines" ,  :action=>'popola', :id=> @patient %>

def popola
  @vaccines = Vaccine.find :all
  @patient=Patient.find(params[:id])
  render :action => paziente (la pagina attuale e' paziente.html.erb)
end