Przekierowania w pluginie RESTful_authentication

Witam

Używam w swojej aplikacji plugin RESTful_authentication. Mam problem z ustaleniem odpowiednich przekierować po zalogowaniu. W pluginie są metody odpowiedzialne za przekierowania

[code]def store_location
session[:return_to] = request.request_uri
end

def redirect_back_or_default(default)
session[:return_to] ? redirect_to_url(session[:return_to]) : redirect_to(default)
session[:return_to] = nil
end[/code]
Metoda store_location jest wywoływana w metodzie access_denied która to jest wywoływana podczas próby uszycia metody dostępnej tylko dla użytkownika zalogowanego.

W kontrolerze sesji w metodzie create w sytuacji pomyślnego utworzenia sesji (zalogowania) jest takie wywołanie metody

redirect_back_or_default('/')

Gdy użytkownik nie jest zalogowany i kliknie w link do metody dostępnej tylko dla zalogowanego użytkownika np.

<%= link_to 'Edytuj', edit_article_path(article) %>

to pokazuje się strona logowania i po pomyślnym logowaniu następuje przekierowanie na

articles/1/edit

Niestety jak użytkownik kliknie na jakiejś podstronie link

<%= link_to 'Zaloguj się', login_path %>

to po pomyślnym logowaniu jest przenoszony na stronę główną ponieważ metoda store_location nie została wywołana więc session[:return_to] ma wartość nill

W poszukiwaniu rozwiązania trafiłem na RESTful Authentication Redirects. Jednak ta metoda działa w przypadku gdy formularz logowania znajduje się na stronie z treścią, a ja mam oddzielną stronę z formularzem logowania.

Wydaje mi się, że rozwiązaniem mogło by być wywołanie metody store_location w momencie gdy użytkownik klika w link znajdujący się w layoucie application.rhtml

<%= link_to 'Zaloguj się', login_path %>

jednak nie wiem jak to zrobić (jeżeli w ogóle da się to zrobić w ten sposób).

Tez mnie cos podobnego przesladowalo. Mozna uzyc parametru np. login_path(:return_to => CGI.escape(“current_url”)). Ale to dosyc brzydkie rozwiazanie wiec proponuje tak:

[code]## w application.rb

protected
def store_uri
session[:return_to] = request.request_uri if !request.xhr? # only non ajax
end

def store_uri_before_redirect
  session[:return_to_before_redirect] = request.request_uri if !request.xhr? # only non ajax
end

we wszystkich kontrolerach do kt. chcemy wrocic i kt. poszczeg. akcje wymagaja logowania (pomijamy w SessionsController)

acces_denied impl. as before_filter - redirects to sessions/new

before_filter :acces_denied, :only => [:new, :create, :edit, :update, :destroy]

after all before filters that can redirect!

before_filter :store_uri, :only => [:new, :edit, :show, :index]

before any redirect occurs

prepend_before_filter :store_uri_before_redirect, :only => [:new, :edit, :show, :index]

application_helper.rb

def link_to_cancel
link_to “Anuluj”, session[:return_to] || “/”
end

sessions_controller.rb, w create jesli pomyslne logowanie

redirect_to session[:return_to_before_redirect] || “/”[/code]

  1. Explicit - klikamy na link do logowania (:return_to_before_redirect == :return_to)

session[:return_to] = “/articles/1”
session[:return_to_before_redirect] = “/articles/1”
Po zalogowaniu (lub anulujac) wracamy tam skad przyszlismy

  1. Implicit - przekierowanie (:return_to_before_redirect != :return_to)

session[:return_to] = “/articles/1” - nie zdazy sie zaktualizowac do “articles/1/edit” bo zostaniemy zatrzymani przez filter acces_denied i zostaje poprzednia akcja
session[:return_to_before_redirect] = “/articles/1/edit” - tu zawsze bedzie zapisana nasza ostatnia akcja

Jezeli chcemy anulowac (link_to_cancel) to wracamy do poprzedniej jezeli sie zalogowalismy to przechodzimy do edit (tak jakby do przodu, chociaz naprawde juz tam bylismy tylko zostalismy zatrzymani przez filter)

I to by bylo na tyle:)

Dzięki za wyczerpującą odpowiedź.