Rails: сессии + представления зависят от реферера? - PullRequest
0 голосов
/ 29 марта 2011

У меня есть приложение с фотографиями.Пользователи могут просматривать фотографии непосредственно по ссылке, закладке и т. Д., Или они могут искать фотографии или просматривать папки с фотографиями.

Независимо от того, как они находят фотографию, они приземляются на 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.


Другими словами, после загрузки запроса в сеанс он сохраняется, что обычно хорошо, кромекогда пользователь переходит непосредственно к фотографиям, используя закладки или историю и т. д. В этом случае было бы лучше, если бы сеанс был просто очищен, поэтому никакие «следующие / предыдущие» фотографии не будут отображаться (поскольку пользователь не просматривал эту страницуиндекс).

Итак, все, что настроено для этих вопросов:

  1. Есть ли способ очистить параметр сеанса [: запрос], основанный на реферере?То есть, например, если пользователь не получил здесь folders#show или photos#search или другую фотографию, включенную в исходный запрос, то забудьте старый запрос.

  2. Есть лиспособ, чтобы представление отвечало и предыдущему рефереру?Примерно так: если пользователь попал туда с folders#show, то скажите «Другие фотографии из этой папки», но если пользователь попал туда с photos#search, то скажите «следующий результат поиска / предыдущий результат поиска»

Я довольно озадачен этим, и я был бы очень признателен за любые предложения.

Спасибо !!

1 Ответ

2 голосов
/ 29 марта 2011

Вы можете сделать что-то вроде:

session[:query] = nil if /photos\/search|folders\/show/.match(request.env["HTTP_REFERER"]) || photo_included_in_query

Где бы вы реализовали метод photo_included_in_query.

Для представления вы можете выделить эту логику в помощник, например:

def request_from_folder?
  /folders\/show/.match(request.env["HTTP_REFERER"]) 
end

А по вашему мнению:

<% if request_from_folder? %>
  Other photos from this folder
<% else %>
   Next/Previous
<% end %>
...