У меня есть приложение с фотографиями.Пользователи могут просматривать фотографии непосредственно по ссылке, закладке и т. Д., Или они могут искать фотографии или просматривать папки с фотографиями.
Независимо от того, как они находят фотографию, они приземляются на photos#show
просмотр.Однако они могут получить это представление из photos#search
или из folders#show
.
. Я работаю над созданием «следующей / предыдущей» функции фотографии.Вот что у меня так далеко ...
В любом действии контроллера, которое показывает индекс фотографий, есть следующая строка:
session[:query] = @photos.map(&:id)
Это генерирует массивидентификаторы для фотографий, которые будут показаны пользователю в этом представлении.
Вот модель Photo:
# NEXT / PREVIOUS FUNCTIONALITY
def previous(query)
unless query.nil?
index = query.find_index(self.id)
prev_id = query[index-1] unless index.zero?
self.class.find_by_id(prev_id)
end
end
def next(query)
unless query.nil?
index = query.find_index(self.id)
next_id = query[index+1] unless index == query.size
self.class.find_by_id(next_id)
end
end
Приведенные выше методы принимают массив идентификаторов, находят текущие фотографиипоместите в этот массив, а затем найдите идентификаторы, идущие до и после него.
Итак, в контроллере photos#show
у меня есть:
...
if session[:query]
@next_photo = @photo.next(session[:query])
@prev_photo = @photo.previous(session[:query])
end
...
Итак, это на самом деле работает довольно хорошо, но с одной большой «гочей»:
Если пользователь попадает в просмотр фотографий, просматривая сайт, все в порядке, но если пользователь попадает на фотографию через закладку, ссылку или пропускВозвращаясь к своей истории, СЕССИЯ все еще удерживает старый запрос, но теперь пользователь просматривает фотографию, которая могла или не могла быть частью этого запроса, а также «следующие» и «предыдущие» фотографии, которые отображаютсятеперь часть старого запросаy.
Это немного сбивает с толку, так что представьте себе следующее (простейший случай):
Пользователь просматривает папку с изображениями и находит фотографии с идентификаторами: 1,2, 3, 4, 5
Пользователь просматривает это немного и думает, что фотография 4 аккуратная.При просмотре фотографии 4 фотографии 3 и 5 отображаются как «предыдущая» и «следующая».Пользователь закладывает эту страницу в закладки.
Затем пользователь идет и проводит поиск, который возвращает фотографии: 1, 4, 7, 9, 12
Пользователь нажимает на фотографию 1, смотрит нафотография, а затем покидает сайт на мгновение, чтобы перейти в Википедию или что-то.Желая вернуться на сайт, пользователь нажимает на закладку для фотографии 4.
Теперь пользователь видит фотографию 4, но поскольку последний запрос в сеансе был для поиска, пользователь видит фотографии 1 и 7 как предыдущие./ next, тогда как в последний раз, когда пользователь заходил на эту страницу, он видел фотографии 3 и 5.
Другими словами, после загрузки запроса в сеанс он сохраняется, что обычно хорошо, кромекогда пользователь переходит непосредственно к фотографиям, используя закладки или историю и т. д. В этом случае было бы лучше, если бы сеанс был просто очищен, поэтому никакие «следующие / предыдущие» фотографии не будут отображаться (поскольку пользователь не просматривал эту страницуиндекс).
Итак, все, что настроено для этих вопросов:
Есть ли способ очистить параметр сеанса [: запрос], основанный на реферере?То есть, например, если пользователь не получил здесь folders#show
или photos#search
или другую фотографию, включенную в исходный запрос, то забудьте старый запрос.
Есть лиспособ, чтобы представление отвечало и предыдущему рефереру?Примерно так: если пользователь попал туда с folders#show
, то скажите «Другие фотографии из этой папки», но если пользователь попал туда с photos#search
, то скажите «следующий результат поиска / предыдущий результат поиска»
Я довольно озадачен этим, и я был бы очень признателен за любые предложения.
Спасибо !!