Je ne comprends rien à la pagination

Bonjour,

Débutant sur rails, je suis en train de faire quelques tests pour voir
si je peux l’utiliser pour refaire un de mes sites qui est en php, et
je dois avouer que malgré l’aide du livre ruby on rails chez Eyrolles
et la lecture des forums, je n’arrive pas à faire marcher la
pagination quand je fais une recherche avec condition, puisque la
première page est bien affichée mais ensuite pour les pages suivantes
soit cela afficje l’ensemble de ma table soit ça affiche n’importe
quoi.
Je vous explique un peu plus en détail ce que j’ai fais.
1- fort de mes lectures et constatant que la pagination standard
allait disparaitre , j’ai installé le plugin paginating_find
2- dans mon modèle (recette.rb) j’ai défini ma fonction de recherche
avec condition et pagination
def self.find_recette_by_name(search_string)
find(:all, :conditions => [‘name LIKE ?’, “%#{search_string}
%”], :page => {:size => 10})
end
3- j’ai un partiel avec une form ou je saisi mon critère

Entrer le nom (partiel) de la recette <% form_remote_tag :url => {:action => :search} do %> <%= text_field_tag :search_rec, params[:search_rec] %> <%= submit_tag "Rechercher", :class => "submit" %> <% end %> 4-Ce partiel fait appel à une action search de mon controller principal def search @recettes = Recette.find_recette_by_name(params[:search_rec]) end 5- ce lui même pointe sur un search.rjs pour afficher un partiel (_list_recipe.rhtml) avec le résultat de la recherche page[:search_form].visual_effect :blind_up page[:home].visual_effect :blind_up page.replace_html("list_recipe", :partial => "list_recipe") page[:list_recipe].visual_effect :blind_down

6- enfin le partiel

Résultat de la recherche contenant <%= params[:search_rec] %>

<% for recette in @recettes -%>
<% form_remote_tag :url => {:action => :add_to_caddy, :id => recette } do %> <%= submit_tag "Panier" %> <% end %>
<%= recette.name %>
<% end %> <%= link_to_remote(h('< "list_recipe", :url => { :page => @recettes.previous_page, :params=> { :search_rec => params[:search_rec] }} ) %> <%= link_to_remote(h('Next >>'), :update => "list_recipe", :url => { :page => @recettes.next_page, :params=> { :search_rec => params[:search_rec] }} ) %>

Sur ce partiel j’ai essayé plein de chose en essayant de passer le
paramètre search_rec, sans le passer, avec des syntaxe différentes
mais rien n’y fait, la première page est toujours correcte (il s’agit
bien de la sélection) mais les pages suivantes, soit c’est du grand
n’importe quoi (comme avec la syntaxe ci-dessus), soit ça me réaffiche
toutes les lignes de ma table (paginées)

Votre aide serait la bienvenue, je suis sur que c’est parceque il y a
quelque chose que je n’ai pas compris. Je sais aussi que j’aurai du
commencer sans ajax pour ne pas compliquer mon conde, mais il se
trouve que c’est ce que j’ai fait mais sans sélection et pagination
avant de passer à ajax et sélection/pagination.

Merci par avance de votre aide et désoler de ce long post.

Nicolas :

1- fort de mes lectures et constatant que la pagination standard
allait disparaitre ,

Il ne disparaît pas, il est enlevé de Core et est toujours disponible
sous la forme du plugin classic_pagination si on souhaite l’utiliser.

j’ai installé le plugin paginating_find

2- dans mon modèle (recette.rb) j’ai défini ma fonction de recherche
avec condition et pagination
def self.find_recette_by_name(search_string)
find(:all, :conditions => [‘name LIKE ?’, “%#{search_string}
%”], :page => {:size => 10})
end

Sans aller plus loin dans tous les détails que tu as exposées,
je m’arrête déjà
là.
Ton finder n’utilise pas le paramètre :current, ce qui fait que
par défaut il te retourne la première page. Ta méthode doit
avoir au moins deux arguments, la chaîne de recherche et
le numéro de la page demandée (avec 1 comme valeur par défaut).

Tu peux écrire des tests unitaires pour vérifier le comportement
de ta méthode. De plus, tu peux mettre un ‘guard’ qui t’avertit
si search_string est une chaîne vide (car dans ce cas là le
critère sur name ne sert à rien).

À mon avis, si tu règles déjà ceci, ça te permet de partir
sur de bonnes bases (et étudier l’utilisation de params[:page]
par la suite).

Après, il y a peut-être un pb dans le code de ta vue, mais
faut d’abord être sûr que le point de départ (le modèle)
est correct.

Merci par avance de votre aide et désoler de ce long post.

La question était bien posée avec beaucoup d’éléments, ce
qui est loin d’être le cas de la majorité des questions posées sur
la liste.

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Merci Jean-François,

Je n’ai pas encore fait de tests mais à la lecture de ta réponse, j’ai
le sentiment que tu m’as mis sur la bonne piste et effectivement du
coup le code me ma vue n’est sans doute pas bon.

Je vous tiens au courant de mes résultats.

Merci encore de ta réponse rapide.

Jean-François,

Merci, grace à ton aide j’ai réussi à faire marcher la pagination. Le
résultat est encore assez moche mais au moins il fonctionne :wink:

Merci encore.

Salut Nicolas,
si tu débutes dans rails je te conseille de démarrer directement sur
la version 2.0 de rails, ça évitera le double apprentissage. En ce qui
concerne la pagination elle n’existe plus dans Rails 2.0 mais il y a
un plugin qui est bien plus simple (et efficace) que la pagination de
rails 1.2.x
tu peux le trouver ici:
./script/plugin install svn://errtheblog.com/svn/plugins/will_paginate

oui je sais c’est pas bien de commencer avec une version pas stable
mais Rails2 est sur le point de sortir donc bon, c’est juste mon avis
hun :slight_smile:

si tu débutes dans rails je te conseille de démarrer directement sur la
version 2.0 de rails, ça évitera le double apprentissage.

+1 :slight_smile:

ou vais je trouver la documentation
En ligne.

pour l’instant j’ai un livre sur la version 1.2
Les fondamentaux sont inchangés. En tout cas en débutant.

n’est ce pas un pb pour l’hébergement? Déjà qu’il n’y en pas beaucoup.
Ca rique d’être identique !
De toutes façon pour être en 2.0 aujourd’hui ton appli devra embarquer
TOUT
rails 2.0 qui prendra le pas sur la version installée sur le serveur.

(Google, rake rails:freeze:edge)

On 10/14/07, Tranquiliste [email protected] wrote:

Je veux bien démarrer avec la version 2, mais je me pose plusieurs
questions :

  • ou vais je trouver la documentation (pour l’instant j’ai un livre
    sur la version 1.2)

Tu peux aussi trouver l’API de Edge sur le site de caboo[1]

[1] : http://caboo.se/doc.html

  • il y a beaucoup de nouveautés?

Pas énormément. Cette version est surtout de l’amélioration technique.
Beaucoup d’application fonctionne directement avec Rails 2.0 sans trop
de modification.


Cyril M.

Nicolas :

Merci, grace à ton aide j’ai réussi à faire marcher la pagination. Le
résultat est encore assez moche mais au moins il fonctionne :wink:

Il ne te reste plus qu’à indiquer les modifications que tu as
finalement faites dans le code pour que ça marche, pour que ta
première intervention (je crois) sur la liste soit parfaite.

– Jean-François.


À la renverse.

Je veux bien démarrer avec la version 2, mais je me pose plusieurs
questions :

  • ou vais je trouver la documentation (pour l’instant j’ai un livre
    sur la version 1.2)
  • il y a beaucoup de nouveautés?
  • n’est ce pas un pb pour l’hébergement? Déjà qu’il n’y en pas
    beaucoup.

Patrick :

si tu débutes dans rails je te conseille de démarrer directement sur
la version 2.0 de rails, ça évitera le double apprentissage.

On ne peut pas s’affranchir du double apprentissage, àmha.
On ne peut pas y échapper.

La littérature, les tutoriels, la grande majorité des posts
de blog, ce qu’on trouve sur Internet… n’est pas à jour avec 2.0

Il faut connaître les différences (notamment entre 2.0 et 1.2) pour
pouvoir adapter une solution que tu peux trouver. Savoir qu’est-ce
qui est une alternative d’un remplacement.

Exemple, les migrations. Si je trouve un post sur le net
qui me dit d’écrire :

t.column :created_at, :datetime
t.column :updated_at, :datetime

lors de la création d’une table, je peux l’adapter en écrivant :

t.timestamps

tout comme je peux ne rien modifier, car dans ce cas j’ai une
notation alternative.

C’est pareil pour les dépréciations. Si tu (= Nicolas) les connais, tu sais
ce qu’il est possible de faire dans 1.2.* et qui ne l’est plus dans 2.0,
donc tu apprends de manière double en quelque sorte.

Honnêtement si tu (= Nicolas) lis tranquillement déjà ceci :

t’es déjà au courant de pas mal de choses.

Les 2 points peut-être les plus pertubants sont la mise en plugins
de fonctionnalités comme acts_as_*, in_place_editor…
et le changement d’extensions des templates .rhtml → .html.erb …
Pas de quoi donner des insomnies non plus.

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

On 15 oct, 12:01, “Jean-François” [email protected] wrote:

Nicolas :

Merci, grace à ton aide j’ai réussi à faire marcher la pagination. Le
résultat est encore assez moche mais au moins il fonctionne :wink:

Il ne te reste plus qu’à indiquer les modifications que tu as
finalement faites dans le code pour que ça marche, pour que ta
première intervention (je crois) sur la liste soit parfaite.

– Jean-François.
Tout à fait. Donc voici l’explication et la modification du code
correspondant.
Explication :
Rappel : j’utilise le plugin paginating_find
Comme me l’a fait remarquer Jean François, je n’avais pas indiqué dans
ma métohode de recherche, le numéro de page que je voulais afficher
(:current).
J’ai donc modifié la méthode de recherche dans mon modèle en y
ajoutant le paramètre current_page (par défaut à 1)
def self.find_recette_by_name(search_string, current_page = 1)
find(:all, :conditions => [‘name LIKE ?’, “%#{search_string}
%”], :page => {:size => 10, :current => current_page})
end

J’ai rajouté un champs “hidden” pour contenir le numéro de page sur la
form de recherche (3)
<%= hidden_field_tag :current_page, params[:current_page] %>

Et dans ma vue (6), j’ai modifié mon lien vers la page suivante comme
ceci afin de passer en paramètre la chaine à rechercher et la page à
afficher
<%= link_to_remote “suivant”, :url => {:action => “search”, :params =>
{:search_tring => @params[:search_string], :current_page =>
@recettes.next_page}} %>

Il ne reste plus ensuite qu’à modifier la vue (helper?) pour afficher
précédent, les numéros de page, … pour que tout cela soit un peu
plus joli et facile d’utilisation.

Voilà j’espère que c’est clair.