Salut, Juste pour dire que j'ai testé drapper et inherited_resources. Ça fonctionne parfaitement avec ceci : https://github.com/drapergem/draper#when-to-decorate-objects.
Je suis assez content du résultat et mes vues sont plus propre. J'aime aussi le decorates_finder. Pour moi c'est parfait et tout est propre dans ma tête aussi. Merci pour votre aide. Le 12 juin 2013 04:59, Nicolas Blanco <[email protected]> a écrit : > 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 . > > > -- -- 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 .
