Исключения должны только быть возвращены, где что-то происходит, который Вы не ожидали.
другая точка исключений, исторически, то, что коды возврата являются по сути собственными, иногда 0 мог быть возвращен из функции C для указания на успех, иногда-1, или любого из них для сбоя с 1 для успеха. Даже когда они перечисляются, перечисления могут быть неоднозначными.
Исключения могут также предоставить намного больше информации и конкретно обстоятельно объяснить хорошо, 'Что-то Пошло не так, как надо, вот то, что, отслеживание стека и некоторая информация о поддержке для контекста'
Однако хорошо перечислимый код возврата может быть полезен для известного набора результатов, простые 'наймы n результаты функции, и это просто выполнило этот путь'
Если каждый заголовок уникален и вам нужен алфавитный алфавит, попробуйте это в своей модели Post
.
def previous_post
self.class.first(:conditions => ["title < ?", title], :order => "title desc")
end
def next_post
self.class.first(:conditions => ["title > ?", title], :order => "title asc")
end
Затем вы можете ссылаться на них в представлении.
<%= link_to("Previous Post", @post.previous_post) if @post.previous_post %>
<%= link_to("Next Post", @post.next_post) if @post.next_post %>
Не проверено , но он должен приблизить вас. Вы можете изменить заголовок
на любой уникальный атрибут ( created_at
, id
и т. Д.), Если вам нужен другой порядок сортировки.
Вот как я это сделал. Во-первых, добавьте пару именованных областей к вашей модели 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
Обратите внимание на использование параметра : выберите
, чтобы ограничить поля, потому что вы, вероятно, не Я не хочу получать полностью заполненный экземпляр Post
только для показа ссылок.
Затем в моем posts_helper
у меня есть этот метод:
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
Я уверен, что это могло быть реорганизованным, чтобы быть менее подробным, но цель ясна. Очевидно, что ваши требования к разметке будут отличаться от моих, поэтому вы можете не использовать, например, неупорядоченный список.
Важным моментом является использование операторов if
, потому что если вы используете первый пост, тогда они не будут предыдущим постом, и наоборот, если вы на последнем посте, они не будут следующим постом.
Наконец, просто вызовите вспомогательный метод из вашего представления:
<%= sidebar_navigation_links %>
Попробуйте will_paginate Gem. Он предоставляет все функции, необходимые для разбивки ваших записей на страницы. изучите здесь тоже
Вы также можете посмотреть здесь , например, код, если вы хотите добавить следующие и предыдущие кнопки.
Вам просто нужно выполнить 2 запроса, по одному для каждого из «prev» и «next». Предположим, у вас есть столбец created_at.
Псевдо-код:
# get prev
select * from posts where created_at < #{this_post.created_at} order by created_at desc limit 1
# get next
select * from posts where created_at > #{this_post.created_at} order by created_at desc limit 1
Конечно, «this_post» - это текущее сообщение.
Если ваши сообщения хранятся в столбце auto_increment, и вы не используете повторно идентификаторы, вы можете просто использовать столбец id вместо created_at - столбец id уже должен быть проиндексирован. Если вы хотите использовать столбец created_at, вам обязательно понадобится индекс для этого столбца.