Metodo search e qualche problema

-----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
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

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

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

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

-----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. :slight_smile:

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:
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
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

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

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.

-----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

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
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

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

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

Nota che il metodo paginate è deprecato, dovresti usare il plugin
will_paginate.

Luca

-----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
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

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

-----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
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


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

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