2008-09-19 2 views
1

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

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

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

Update

Спасибо за совет 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 

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

Update 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 
+0

Существующий файл вида не позволяет перенаправлять ваш контроллер. – kch 2008-09-19 18:48:57

+0

btw, какая версия рельсов? – kch 2008-09-19 18:51:43

ответ

2

Не знаю, почему @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)

0

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

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

Saw принятый ответ :)

+0

Я имею в виду отображение страницы, а не перенаправление на другое действие. – Josti 2008-09-19 17:58:52

0

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

@performed_render 
@performed_redirect 

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

+0

Я пробовал ваш совет без успеха, хотя я думаю, что это правильное направление – Josti 2008-09-19 17:59:35

1

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

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 :: База для этого.

Смежные вопросы