-----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. 
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:
- ho rimosso la search dal controller per farla in Patient [ok]
- 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
- controller chiamato home, senza model;
- scaffold patient
Ora io voglio fare una ricerca di patient in
http://url/home/ricovero
Quindi ho:
-
project/controllers/home.rb
Qui ho solo la definzione di index
-
project/view/home/index.html.erb
Qui ho implementato qualche cavolata e il link a /home/ricovero
-
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.
-
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
- project/view/patients/_search.html.erb
Qui ho il codice per la visualizzazione della ricerca
Nome |
Cognome |
<% for u in @patients %>
<%= u.first_name%> |
<%= u.last_name %> |
<% end %>
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:
- 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-----