Вопрос

Используя Rails версии v2.1, допустим, у вас есть действие для контроллера, доступного более чем из одного местоположения.Например, в приложении Rails у вас есть ссылка для редактирования пользователя из двух разных представлений, одно из представления индекса пользователей, а другое из другого представления (скажем, из панели навигации на каждой странице).

Мне интересно, каков наилучший способ перенаправить пользователя обратно в нужное место в зависимости от того, по какой ссылке он нажал.Например:

Пример 1:

  1. Перечислите всех пользователей
  2. Нажмите "Изменить" на пользователя в списке
  3. Пользователь нажимает "сохранить" в форме, контроллер перенаправляет обратно на 1.

Пример 2:

  1. Пользователь может находиться на любой странице приложения, на панели навигации отображается ссылка для редактирования текущего пользователя
  2. Пользователь нажимает на ссылку для редактирования
  3. Пользователь нажимает "сохранить" в форме, контроллер перенаправляет обратно на ту страницу, на которой он был, когда пользователь нажал ссылку "редактировать" в навигационной панели.

Я видел, как это делалось в прошлом с помощью:

  1. Размещение параметра в исходной ссылке редактирования с исходным контроллером / действием, в котором появилась ссылка.Чтобы сделать это более СУХИМ, вы могли бы использовать @controller.controller_name и @controller.action_name в помощнике.
  2. Контроллер сохраняет параметры в переменной сеанса.
  3. Как только контроллер сохранит запись, он перенаправляется на переменную сеанса.

Что мне не особенно нравится в этом решении, так это необходимость добавлять параметр к каждой применимой ссылке в представлениях.Мне интересно, есть ли способ встроить все это в контроллер.

Один из лучших способов, о котором я думал, состоял в том, чтобы:

  1. Поместите before_filter в действие "редактировать", чтобы сохранить реферер (достаточно ли это надежно?) в сеансе.
  2. При нажатии кнопки "обновить" контроллер перенаправит на переменную сеанса, а затем удалит переменную сеанса.

Есть какие-нибудь мысли о том, как лучше всего это сделать?

Это было полезно?

Решение

Я думаю, что использование before_filter в действии редактирования является наименее навязчивым.

Референт должен быть достаточно надежным ...просто установите значение по умолчанию в случае отсутствия реферера (скажем:кто-то добавил страницу редактирования в закладки), и с вами все должно быть в порядке.

Другие советы

Вспышка:Данные, которые вы будете использовать только для следующего запроса, могут быть сохранены во флэш-памяти.Тогда вам не нужно будет автоматически очищать его.Это хорошо работает для ограниченных фрагментов контекста приложения, которые вам обязательно понадобятся только один раз - не только для сообщений об ошибках!

Я знаю, что вы делали при последнем доступе по HTTP:Если вам просто нужно перенаправить людей на последний URL, по которому они были, то просто сделайте это.request.referer для большинства браузеров, которые не блокируют информацию, предоставит вам последний URL, по которому человек был.

#in edit controller
...
flash[:page_to_redirect_to] = request.referer || "/my/default/path"
...

#in save controller
redirect_to flash[:page_to_redirect_to] || "/my/default/path"

Кстати, я бы не стал предлагать их жестко кодировать.

before_filter перед_фильтром:Я вижу, что многие разработчики Rails используют это как свой любимый молоток, а все остальное превращают в гвозди.Фильтры полезны, когда вы хотите предоставить функциональность всем или практически всем методам в контроллере.Я не уверен, что здесь это обязательно так, но ваш пробег может отличаться.При необходимости вы можете комбинировать фильтр с двумя вышеперечисленными приемами.

Другой подход заключается в загрузке формы в виде наложения, например http://flowplayer.org/tools/overlay/index.html, а затем при отправке ajax вы можете закрыть наложение.Я делаю это в сочетании с автозаполнением, чтобы предложить опцию "добавить новый".Как только форма наложения отправлена, я возвращаю некоторые данные в формате json, которые обрабатываются для заполнения автозаполнения.(Я сделал свой собственный плагин чтобы помочь со всем этим)

Это требует немного больше работы, но это действительно хорошо работает для конечного пользователя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top