La plupart du temps la recherche est bindé à un formulaire, et il faut
garder l'état de ce formulaire lorsque la recherche est effectuée,
même si c'est juste un text field et une check box.

Je fais toujours un modèle type ActiveModel, dans un namespace (par
exemple Search), le modèle contient la logique de la recherche et une
méthode d'instance principale qui retourne le scope final de la
recherche (lorsque c'est du AR/Mongoid, ou bien les résultats Tire
pour ElasticSearch).

Exemple :

class Search::Doctor < BasicActiveModel # Mon ancienne gem Rails 3 en
attendant Rails 4 et son ActiveModel::Model
  attr_accessor :city_id, :doctor_speciality
  # ...

  def execute
    doctors = Doctor.with_state(:confirmed)

    doctors = doctors.where(city_id: city_id) if city_id.present?
    # ... La logique
    # ...
    doctors
  end
end

Dans le contrôleur de recherche on a deux expose, un pour l'objet de
recherche initialisé avec les params, pour garder l'état du formulaire
et un autre avec les résultats.

class SearchesController < ApplicationController
  expose(:search) { Search::Doctor.new(params[:search]) }
  expose(:search_results) { search.execute.page(params[:page]) }

  def show
  end
end

Pas de variables globales, pas de before_filter ou de code dans
l'action principale \o/.

Toute la logique de recherche est testée dans une spec Search::DoctorSpec.

Dans la vue le formulaire de recherche est bindé sur search
(simple_form_for(search, ...)) et  on itère sur les résultats via
search_results.each { ... }.

Si vous avez d'autres techniques/manières de
faire/astuces/commentaires je suis preneur :).

Nicolas.

2013/6/12 thierry henrio <[email protected]>:
>
>
>
> 2013/6/11 Nicolas Blanco <[email protected]>
>>
>> Hey ! Youpi, encore un sujet à troll :D.
>
>
>>
>> Maintenant quand utiliser un Presenter ? C'est simple ! Exemple : tu
>>
>> veux faire l'index du dashboard d'un user lorsqu'il se loggue.
>>
>> Ce dashboard doit afficher une dizaine de stats sur le user, voir des
>> stats globales au site.
>>
>> Plusieurs solutions :
>> * mettre les scopes et le traitement dans le contrôleur/vue : NON
>> (allo quoi !).
>> * mettre les scopes et le traitement dans le modèle User : oui mais
>> non. Pourquoi foutre 15 scopes et/ou méthodes dans ton User qui est un
>> modèle super critique si c'est juste pour afficher les données dans
>> une ou deux vues ?
>> * Presenter : OUI. Une simple classe UserPresenter qui prend le user
>> en initialize et qui expose une stat par méthode. Et dans ton
>> contrôleur un joli : expose(:presenter) {
>> UserPresenter.new(current_user) }. Je pleure tellement c'est beau et
>> bien isolé et testable :').
>
>
> J'aime bien aussi
>
> Et si je prends : "search users" avec les params du post ?
> Tu vas faire un presenter pour la search ou faire une méthode `search` dans
> le controller ?
>
> ?, Thierry
>
> --
> --
> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
> Google Groups.
> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
> [email protected]
> Pour résilier votre abonnement envoyez un e-mail à l'adresse
> [email protected]
> ---
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes
> Railsfrance.
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> [email protected].
> Pour plus d'options, visitez le site
> https://groups.google.com/groups/opt_out .
>
>



-- 
Nicolas Blanco, Web developper

http://www.nicolasblanco.fr
Jabber/GoogleTalk : [email protected]
Twitter : http://twitter.com/slainer68
Github : http://github.com/slainer68
Skype : slainer68

-- 
-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
[email protected]
--- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes 
Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse [email protected].
Pour plus d'options, visitez le site https://groups.google.com/groups/opt_out .


Répondre à