Как реализовать функцию, которая возвращает URL последней посещенной страницы - PullRequest
1 голос
/ 19 сентября 2008

Я хочу сохранить текущий URL в переменной сеанса для ссылки на предыдущую посещенную страницу.

Если я сохраняю каждый URL (через before_filter в ApplicationController), также действия, которые заканчиваются перенаправлением (создание, обновление и т. Д.), Считаются последней посещенной страницей.

Есть ли способ сообщить Rails только выполнить функцию, если шаблон отображается?

Обновление

Спасибо за совет after_filter ... написав так много before_filters, я не видел очевидного. Но трюк с @performed_redirect не работает-

Это то, что я получил до сих пор

class ApplicationController < ActionController::Base

  after_filter :set_page_as_previous_page

  def set_page_as_previous_page
    unless @performed_redirect
      flash[:previous_page] = request.request_uri
    else
      flash[:previous_page] = flash[:previous_page]
    end
  end

end

Мне нужно реализовать ссылку «Вернуться», без использования Javascript, HTTP Referer. Извините, если бы я упомянул об этом, я ценю вашу помощь!

Обновление 2

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

def after_filter   
    if File.exists?(File.join(Rails.root,"app","views", controller_path, action_name+".html.erb"))
      flash[:previous_page] = request.request_uri
    else
      flash[:previous_page] = flash[:previous_page]
    end
  end

Ответы [ 4 ]

2 голосов
/ 19 сентября 2008

Не уверен, почему @performed_redirect не работает, вы можете увидеть, что он существует и имеет желаемые значения, вызвав действия на этом тестовом контроллере:

class RedirController < ApplicationController
  after_filter :redir_raise

  def raise_true
    redirect_to :action => :whatever
  end

  def raise_false
    render :text => 'foo'
  end

  private

  def redir_raise
    raise @performed_redirect.to_s
  end

end

В сторону, вместо того, чтобы делать

flash[:previous_page] = flash[:previous_page]

вы можете сделать

flash.keep :previous_page

(Мой патч, тот. Назад в те дни: P)

1 голос
/ 29 апреля 2009

Другой возможный подход для определения того, является ли ответ перенаправлением по сравнению с рендерингом, заключается в проверке кода состояния:

class ApplicationController < ActionController::Base

  after_filter :set_page_as_previous_page

  def set_page_as_previous_page
    unless 302 == request.status  #redirecting
      flash[:previous_page] = request.request_uri
    else
      flash[:previous_page] = flash[:previous_page]
    end
  end

end

Это действительно похоже на перенаправление? метод в ActionController :: Base для этого.

0 голосов
/ 19 сентября 2008

Контроллер будет иметь эти переменные, которые могут быть полезны:

@performed_render
@performed_redirect

Но в любом случае, как именно вы храните URL? Покажите нам код фильтра. Почему бы не использовать after_filter?

0 голосов
/ 19 сентября 2008

Может быть немного конкретнее? Я не могу получить ваш вопрос - по шаблону вы подразумеваете визуализацию: вид, макет? или только когда вызывается с render: template?

Рендеринг страницы? render: action =>: new - это тоже страница ... Можете ли вы быть более конкретным, для чего вы хотите захватить и что вы хотите исключить?

увидел принятый ответ :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...