# Metodo search e qualche problema

**URL:** <https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876>\
**Category:** IT\
**Created:** [April 15, 2008, 9:31pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876 "2008-04-15T21:31:49Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 15, 2008, 9:31pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/1 "2008-04-15T21:31:49Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Volevo chiedervi aiuto nuovamente, dove sbaglio?

Ho implementato in un controller (che non ha model) il seguente metodo

def search  
@people = Patient.find(:all,:conditions =\> “cf = ‘#{params[:q]}’ OR  
first\_name = ‘#{params[:q]}’”)  
redirect\_to :controller =\> :patients, :action =\> :show, :id =\>  
@people  
rescue  
redirect\_to :controller =\> :patients, :action =\> :new  
end

e funziona… ovvero nella pagina html ho il seguente codice:

\<% form\_tag :action =\> ‘search’ do %\>  
\<%= text\_field ‘q’, nil %\>  
\<%= submit\_tag ‘Search’ %\>  
\<% end %\>

Ma in realta’ vorrei non fare un redirect\_to ma visualizzare subito dopo  
aver spinto search il risultato nella pagina html… come posso fare?

Saluti

* * *

Matteo Buferli  
WEB: [http://www.buferli.com](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](http://enigmail.mozdev.org)

iD4DBQFIBQBV9uWKAWW7WMERAvFlAJ494g96MW2VaK3FeORSTMX5sRwalACXeTIN  
Y8LJ5acSD19dy0gl58lGqg==  
=KzkS  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 15, 2008, 10:34pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/2 "2008-04-15T22:34:15Z")

</div>

Ciao Matteo,  
Innanzitutto ti consiglio di tenere pulito il codice del controller, di  
solito io creo metodi ad-hoc nelle classi di model. E’ un fatto di stile  
e serve a nascondere quello che accade nel layer sottostante.  
Mi spiego con un esempio:

class Patient  
def self.search(params)  
self.find(:all, :contitions =\> [‘cf = ? OR first\_name = ?’,  
params[:q], params[:q]])  
end  
end

Così nel controller ottieni:  
@people = Patient.search(params)

Nota la sintassi con cui vengono passate le conditions, questa forma  
serve ad ActiveRecord a pulire le stringhe di input, e quindi evitare  
attacchi tipo SQL injection. Ti rimando a questo approfondimento:  
[http://manuals.rubyonrails.com/read/chapter/43](http://manuals.rubyonrails.com/read/chapter/43)

Tornando alla tua domanda, ti consiglio di creare un’altra view per  
mostrare i risultati, ad esempio results.html.erb.

def search  
@people = Patient.search(params)

unless @people.empty?  
render :action =\> ‘results’  
else  
# … gestire la ricerca senza risultati  
end  
end

La differenza è che redirect\_to, effettua un redirect (ma va?!) verso  
un’altra action, questo significa che il browser viene “stimolato” ad  
effettuare una nuova request verso la nuova action, con l’effetto di  
perdere i parametri del precendete ciclo request/response. Questo perché  
il protocollo HTTP è stateless.

Ti faccio notare che il metodo di ricerca ritorna un array con zero o  
più elementi, quindi se passi @people come parametro a rendirect\_to, non  
avrà probabilmente gli effetti desiderati.

Luca

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 15, 2008, 11:18pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/3 "2008-04-15T23:18:54Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Grazie tanto, ma sbaglio ancora qualcosa.

Luca G. wrote:

> end  
> end

Perfetto, infatto lo avevo gia’ implementato attendendo la risposta di  
qualcuno. 🙂

> Così nel controller ottieni:  
> @people = Patient.search(params)

Dove lo sistemo?

> Nota la sintassi con cui vengono passate le conditions, questa forma  
> serve ad ActiveRecord a pulire le stringhe di input, e quindi evitare  
> attacchi tipo SQL injection. Ti rimando a questo approfondimento:  
> [Peak Obsession](http://manuals.rubyonrails.com/read/chapter/43)
> 
> Tornando alla tua domanda, ti consiglio di creare un’altra view per  
> mostrare i risultati, ad esempio results.html.erb.

Ricapitoliamo:

1. ho rimosso la search dal controller per farla in Patient [ok]
2. ora ho il “mio controller” e se vado in  
url/mio\_controller/ricerca  
visualizzo il form di ricerca, la pagina e’ la seguente:  
\<% form\_tag :action =\> ‘search’ do %\>  
\<%= text\_field ‘q’, nil %\>  
\<%= submit\_tag ‘Search’ %\>  
\<% end %\>

e ho definito in mio\_controller.rb questa:

> def search  
> @people = Patient.search(session[:q])
> 
> unless @people.empty?  
> render :action =\> ‘results’  
> else  
> # … gestire la ricerca senza risultati  
> end  
> end

Ora ho creato anche la pagina results in:  
view/mio\_controller/results.html.erb  
(attualmente vuota, cosa ci metto?)

Attualmente dopo aver schiacciato search ottengo:

Template is missing

Missing template home\_doctor/search.html.erb in view path  
/home/matte/Lavori/project/aptana/AMS\_medApp/app/views

Cerca un file search.html.erb che non esiste (probabilmente colpa del  
:action =\> search del form di ricerca in  
/mio\_controller/ricerca.html.erb ).

Grazie!

* * *

Matteo Buferli  
WEB: [http://www.buferli.com](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](http://enigmail.mozdev.org)

iD8DBQFIBRcm9uWKAWW7WMERAoYNAJ94Hw7u+VvVebqUSGLmzQwuZrkfcQCfWjTQ  
clzHCuQFVIAsc//poF7iot8=  
=bmG8  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 16, 2008, 10:46am UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/4 "2008-04-16T10:46:11Z")

</div>

Credo che il problema sia l’uso di una action chiamata ‘search’ e di una  
view chiamata ricerca.html.erb. In questo caso Rails si aspetta una  
concordanza di nomi.

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 17, 2008, 6:21pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/5 "2008-04-17T18:21:27Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Mi manca un passo… lo so che sbaglio una cavolata… ma non riesco a  
trovare dove e quindi mi appello nuovamente alla vostra esperienza.

Fino ad ora ho

1. controller chiamato home, senza model;
2. scaffold patient

Ora io voglio fare una ricerca di patient in  
[http://url/home/ricovero](http://url/home/ricovero)

Quindi ho:

1. project/controllers/home.rb  
Qui ho _solo_ la definzione di index

2. project/view/home/index.html.erb  
Qui ho implementato qualche cavolata e il link a /home/ricovero

3. project/view/home/ricovero.html.erb  
Qui ho:  
\<% form\_tag(‘javascript:void(0)’) do %\>  
Listing p \<%= text\_field\_tag ‘search’, @search %\>  
\<%= observe\_field :search,  
:frequency =\> 0.5,  
:update =\> ‘ajaxWrapper’,  
:before =\> “Element.show(‘spinner’)”,  
:complete =\> “Element.hide(‘spinner’)”,  
:url =\> { :action=\> ‘search’,  
:only\_path =\> false},  
:with =\> “‘search=’ + encodeURIComponent(value)” %\>  
\<% end %\>  
\<%= render :partial=\>‘patients/search’ %\>  
Preso dal libro Agile Web v2 e, leggermente modificato.

4. project/controllers/patients\_controller.rb  
Qui ho la definzione del metodo search:

def search  
unless params[:search].blank?  
@patients\_page, @patients = paginate :patients,  
:conditions =\> Patient.conditions\_by\_like(params[:search])  
else  
list  
end  
render :partial =\> ‘search’  
end

1. project/view/patients/\_search.html.erb  
Qui ho il codice per la visualizzazione della ricerca

 \<% for u in @patients %\> \<% end %\>

| Nome | Cognome |
| --- | --- |
| \<%= u.first\_name%\> | \<%= u.last\_name %\> |

Allora fino ad ora vado da (2) a (3), quando pero’ richiedo (3) ho il  
seguente errore:

You have a nil object when you didn’t expect it!  
You might have expected an instance of Array.  
The error occurred while evaluating nil.each

La riga incriminata e’ la seguente:  
6: \<% for u in @patients %\>

Sbaglio forse nel (3)? al campo :url?

Vi chiedo aiuto, dovrei fare andare questa funzione entro stanotte… e  
sono 2 giorni che ci sbatto la testa non capendo dove sbaglio…

Grazie a chiunque mi sapra’ aiutare (anche i miei compagni di lavoro  
ringraziano).

Saluti.

* * *

Matteo Buferli  
WEB: [http://www.buferli.com](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](http://enigmail.mozdev.org)

iD8DBQFIB3Wz9uWKAWW7WMERAqStAJoDEF4tsmtbZ271EtK4B2+RDlAWWwCfTBVe  
InL4Wk9bwacT4Ytr6Lrpf9Q=  
=Ql44  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 17, 2008, 6:33pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/6 "2008-04-17T18:33:53Z")

</div>

Elimina quella riga e scrivi:  
\<%= debug @patients %\>  
Vedi se è nil

Nota che il metodo paginate è deprecato, dovresti usare il plugin  
will\_paginate.

Luca

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 17, 2008, 6:52pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/7 "2008-04-17T18:52:41Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Luca G. wrote:

> Elimina quella riga e scrivi:  
> \<%= debug @patients %\>  
> Vedi se è nil
> 
> Nota che il metodo paginate è deprecato, dovresti usare il plugin  
> will\_paginate.
> 
> Luca

Si e’ nil… come fa a non esserlo se non ho ancora fatto ricerche?  
Come si risolve?

Grazie per l’aiuto…

* * *

Matteo Buferli  
WEB: [http://www.buferli.com](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](http://enigmail.mozdev.org)

iD8DBQFIB32h9uWKAWW7WMERAgyVAJ9xoYBt8yHypQW+8s3D6BzjQG+jvgCfZx4F  
vLaIWqcVu7+rEnFTar5n0t4=  
=atyt  
-----END PGP SIGNATURE-----

---

<div class="post-metadata">

**Author:** ![matte\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/4da419/32.png) [@matte\_S](https://www.ruby-forum.com/u/matte_S)\
**Post date:** [April 17, 2008, 6:42pm UTC](https://www.ruby-forum.com/t/metodo-search-e-qualche-problema/134876/8 "2008-04-17T18:42:06Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

Dimenticavo:

> 1. project/view/home/ricovero.html.erb  
> Qui ho:

\<%= render :partial=\>'patients/search' %\>
\> \<% end %\> \> \<%= render :partial=\>'patients/search' %\>
* * *

Ml mailing list  
removed\_email\_address@domain.invalid  
[http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

* * *

Matteo Buferli  
WEB: [http://www.buferli.com](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](http://enigmail.mozdev.org)

iD8DBQFIB3ta9uWKAWW7WMERAg/AAJ9qu0Cza7435DxnxMskb5FJyZ0aqQCfSJnY  
uXt7bHDsuHI2NO9Gufl24gs=  
=PBeB  
-----END PGP SIGNATURE-----
