2013-02-02 8 views
22

So che posso usare request.referrer per ottenere l'URL di richiesta completo in Rails, ma c'è un modo per ottenere il nome del controller solo dalla richiesta?Un buon modo per ottenere il nome del controller da un request.referer in Rails

voglio vedere se l'URL di http://myurl.com/profiles/2 comprende "profili"

So che posso usare una regex per farlo, ma mi chiedevo se ci fosse un modo migliore.

+0

non sembra essere un approccio giusto a tutti. Cosa succede se qualche altro server è il referrer? – Eru

+1

http: // localhost: 3000 ok test completo grazie ragazzi :) –

+0

Per favore @ tvalent2, riseleziona la risposta corretta. Le upvotes parlano da sole. –

risposta

-2

All'interno del controller, si ha il metodo controller_name che restituisce solo il nome. Nel tuo caso, restituirebbe "profili". È inoltre possibile utilizzare params[:controller] che restituisce la stessa stringa.

+15

Questa domanda non è stata accettata in modo errato? Non voleva sapere come decomporre l'azione/controller del referrer e non l'azione corrente? – GigaBass

82

Ricordare che request.referrer fornisce l'URL della richiesta prima di quello corrente. Detto questo, ecco come è possibile convertire request.referrer al controllore/informazioni ActionN:

Rails.application.routes.recognize_path(request.referrer) 

dovrebbe dare qualcosa come

{:controller => "x", :action => "y"} 
+1

Genio. Grazie. – Abram

+4

'Rails.application.routes.recognize_path (request.referrer) [: controller]' per la precisione. – marcantonio

+2

Grazie mille signore, mi hai salvato il tempo. –

4

Qui è la mia prova che funziona con Rails 3 & 4. Il presente Codice estrae un parametro al logout e reindirizza l'utente alla pagina di accesso personalizzata altrimenti reindirizza alla pagina di accesso generale. Puoi facilmente estrarre :controller in questo modo. parte Controller:

def logout 
    auth_logout_user 
    path = login_path 
    begin 
    refroute = Rails.application.routes.recognize_path(request.referer) 
    path = subscriber_path(refroute[:sub_id]) if refroute && refroute[:sub_id] 
    rescue ActionController::RoutingError 
    #ignore 
    end 
    redirect_to path 
end 

E le prove sono importanti così:

test "logout to subscriber entry page" do 
    session[:uid] = users(:user1).id 
    @request.env['HTTP_REFERER'] = "http://host/s/client1/p/xyzabc" 
    get :logout 
    assert_redirected_to subscriber_path('client1') 
end 

test "logout other referer" do 
    session[:uid] = users(:user1).id 
    @request.env['HTTP_REFERER'] = "http://anyhost/path/other" 
    get :logout 
    assert_redirected_to login_path 
end 

test "logout with bad referer" do 
    session[:uid] = users(:user1).id 
    @request.env['HTTP_REFERER'] = "badhost/path/other" 
    get :logout 
    assert_redirected_to login_path 
end 
+0

woot woot per TDD su una risposta! –

Problemi correlati