Как перенаправить на предыдущую страницу в Ruby On Rails?

У меня есть страница, на которой перечислены все проекты с сортируемыми заголовками и нумерацией страниц.

path:
/projects?order=asc&page=3&sort=code

Я выбираю для редактирования один из проектов

path:
projects/436/edit

Когда я нажимаю "Сохранить" на этой странице, он вызывает метод контроллера / обновления проекта. После того, как я обновлю код, я хочу перенаправить на путь, по которому я был, прежде чем я щелкнул по редактированию конкретного проекта. Другими словами, я хочу быть на той же странице с той же сортировкой.

Я видел link_to (: back) и думал, что: back может работать в redirect_to (: back), но это не пойдет.

puts YAML::dump(:back) 
yields the following:
:back 

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

вопрос задан 26.01.2010
easement
4572 репутация

7 ответов


  • 304 рейтинг

    В действии редактирования сохраните запрашивающий URL-адрес в хэше сеанса, который доступен для нескольких запросов:

    session[:return_to] ||= request.referer
    

    Затем перенаправьте на него в действии обновления после успешного сохранения:

    redirect_to session.delete(:return_to)
    
    ответ дан Jaime Bellmyer, с репутацией 20497, 26.01.2010
  • 93 рейтинг

    Почему redirect_to(:back) не работает для вас, почему это не идет?

    redirect_to(:back) работает как шарм для меня. Это просто короткий путь для redirect_to(request.env['HTTP_REFERER'])

    http: // apidock. com / rails / ActionController / Base / redirect_to (до Rails 3) или http: // apidock. ru / rails / ActionController / Redirecting / redirect_to (Rails 3)

    Обратите внимание, что redirect_to(:back) устарела в Rails 5. Вы можете использовать

    вместо redirect_back(fallback_location: 'something') (см. http: // blog. bigbinary. ком / 2016/02/29 / Рельсы-5-улучшает-redirect_to_back-с-перенаправлением-назад. HTML )

    ответ дан pascal betz, с репутацией 5570, 13.02.2011
  • 45 рейтинг

    Мне нравится метод Хайме с одним исключением, для меня лучше работать каждый раз, когда я заново сохраняю реферер:

    def edit
        session[:return_to] = request.referer
    ...
    

    Причина в том, что если вы редактируете несколько объектов, вы всегда будете перенаправлены обратно на первый URL-адрес, который вы сохранили в сеансе с методом Jaime. Например, допустим, у меня есть объекты Apple и Orange. Я редактирую Apple, и session[:return_to] устанавливается для рефери этого действия. Когда я иду редактировать апельсины, используя тот же код, session[:return_to] не будет установлен, потому что он уже определен. Поэтому, когда я обновлю Orange, меня отправят рефереру предыдущего действия Apple # edit.

    ответ дан Tony, с репутацией 10302, 21.10.2010
  • 33 рейтинг

    Вот как мы это делаем в нашем приложении

    def store_location
      session[:return_to] = request.fullpath if request.get? and controller_name != "user_sessions" and controller_name != "sessions"
    end
    
    def redirect_back_or_default(default)
      redirect_to(session[:return_to] || default)
    end
    

    Таким образом вы сохраняете последний GET-запрос только в параметре сеанса :return_to, поэтому все формы, даже если многократный POSTed будет работать с :return_to.

    ответ дан MBO, с репутацией 23603, 26.01.2010
  • 18 рейтинг

    request.referer устанавливается Rack и устанавливается следующим образом:

    def referer
      @env['HTTP_REFERER'] || '/'
    end
    

    Просто сделайте redirect_to request.referer, и он всегда будет перенаправлять на страницу с истинной ссылкой или путь к корню ('/'). Это важно при прохождении тестов, которые терпят неудачу в случаях прямой навигации к конкретной странице, на которой контроллер выдает redirect_to: back

    ответ дан Steve Tipton, с репутацией 181, 25.03.2011
  • 12 рейтинг

    В рельсах 5 согласно инструкциям в Руководстве по рельсам вы можете использовать:

    redirect_back(fallback_location: root_path)
    

    Местоположение 'back' берется из заголовка HTTP_REFERER, который не гарантируется браузером. Вот почему вы должны предоставить 'fallback_location'.

    ответ дан pSkarl, с репутацией 149, 3.07.2016
  • 1 рейтинг

    Для тех, кто заинтересован, вот моя реализация, расширяющая оригинальный ответ MBO (написанный против рельсов 4. 2. 4, рубин 2. 1. 5).

    class ApplicationController < ActionController::Base
      after_filter :set_return_to_location
    
      REDIRECT_CONTROLLER_BLACKLIST = %w(
        sessions
        user_sessions
        ...
        etc.
      )
    
      ...
    
      def set_return_to_location
        return unless request.get?
        return unless request.format.html?
        return unless %w(show index edit).include?(params[:action])
        return if REDIRECT_CONTROLLER_BLACKLIST.include?(controller_name)
        session[:return_to] = request.fullpath
      end
    
      def redirect_back_or_default(default_path = root_path)
        redirect_to(
          session[:return_to].present? && session[:return_to] != request.fullpath ?
            session[:return_to] : default_path
        )
      end
    end
    
    ответ дан aschyiel, с репутацией 165, 8.11.2016