Voici comment je l'ai fait. Tout d'abord, ajouter quelques named scopes à votre modèle Post
:
def previous
Post.find_by_id(id - 1, :select => 'title, slug etc...')
end
def next
Post.find_by_id(id + 1, :select => 'title, slug etc...')
end
Notez l'utilisation de l'option :select
pour limiter les champs parce que vous ne voulez probablement pas récupérer un Post
exemple entièrement peuplé juste pour montrer les liens .
Puis dans mon posts_helper
J'ai cette méthode:
def sidebar_navigation_links
next_post = @post.next
previous_post = @post.previous
links = ''
if previous_post
links << content_tag(:h3, 'Previous')
links << content_tag(:ul, content_tag(:li,
content_tag(:a, previous_post.title,
:href => previous_post.permalink)))
end
if next_post
links << content_tag(:h3, 'Next', :class => 'next') if previous_post
links << content_tag(:h3, 'Next') if previous_post.nil?
links << content_tag(:ul, content_tag(:li,
content_tag(:a, next_post.title,
:href => next_post.permalink)))
end
content_tag(:div, links)
end
Je suis sûr que cela pourrait être refactorisé être moins bavard, mais l'intention est claire. Évidemment, vos exigences de balisage seront différentes de la mienne, donc vous ne pouvez pas choisir d'utiliser une liste non ordonnée, par exemple. L'important est l'utilisation des instructions if
parce que si vous êtes sur le premier poste, il n'y aura pas de post précédent et inversement, si vous êtes sur le dernier post, il n'y aura pas de post suivant.
Enfin, appelez simplement la méthode d'assistance de votre point de vue:
<%= sidebar_navigation_links %>
Merci! est parfait! :) – pollinoco
@Sam, oui, c'est pourquoi j'ai dit "si chaque titre est unique". – ryanb
désolé Ryan, je devrais être aveugle, votre pourrait: conditions => ["titre>? Et id>?", Titre, id] pour contourner. l'ajout d'un index sur le titre est un peu critique ici, sauf s'il s'agit d'une application jouet. –