2013-08-29 7 views
12

Jak wiemy z this post w Rails, można uzyskać poprzednią URL poprzez wywołaniejak określić, czy request.referrer pasuje do rails spokojnej ścieżki?

request.referrer 

Ale jak można sprawdzić, czy poprzedni URL pasuje do jednego z spokojny ścieżek w aplikacji Rails?

Przez spokojny ścieżek, to znaczy ścieżki świadczonych przez Rails, takie jak

books_path 
book_path(book) 
edit_book_path(book) 

Oczywiście mogę zrobić regularne meczu ciąg wyraz request.referrer, ale myślę, że to trochę brzydki.

jednym szczególnym przypadku, w mojej aplikacji jest to, że może być request.referrer "localhost: 3000/książki page = 4"

i chcę do niego dopasować

books_path 

który zwraca "/ books"

W takim przypadku, w jaki sposób mogę sprawdzić, czy jest dopasowanie bez wykonywania wyrażeń regularnych ciąg znaków dopasowania? (Jeśli to w ogóle możliwe)

Dzięki

P.S. Próbowałem dopasować ciąg wyrażenie regularne i działa. Pomyślałem, że może być lepszy sposób w Railsach.

+0

Dlaczego nie można po prostu sprawdzić część domeny polecający, aby zobaczyć, czy to pochodzące z wewnętrznego url zewnętrznych /? Jeśli jest to wewnętrzny, to będzie to trasa zdefiniowana w Twojej aplikacji, jeśli nie, nie będzie. – varatis

+0

@varatis, nie sądzę, że zrozumiałeś moje pytanie.sprawdzenie domeny adresu URL jest bardzo proste. Chcę wiedzieć, czy ten poprzedni URL pasuje do ścieżki "indeks" książek (w moim przykładzie). jak to zrobić bez wykonywania porównania regex? –

+0

Jeśli patrzysz tylko na jedną ścieżkę, wygląda na to, że najprościej byłoby użyć porównania wyrażenia regularnego lub ciągu. – varatis

Odpowiedz

16

Można wyodrębnić część ścieżki do request.referer przy użyciu następujących:

URI(request.referer).path 

Następnie można użyć Rails.application.routes.recognize_path aby sprawdzić, czy ścieżka mapy do kontrolera i działania, np

my_path = URI(request.referer).path 
# => /books 

Rails.application.routes.recognize_path(my_path) 
# => {:action=>"show", :controller=>"books", :page=>"4"} 
+1

Ostrzeżenie: metoda 'recogn_path' jest przestarzała. – sealocal

+4

OK. Wszelkie sugestie dotyczące substytutu? – gitb

2

Chociaż nie jest pewne, co chcesz z tym zrobić, całkiem pewne szyny obsługują lepsze sposoby kontrolowania przekierowań. Niemniej jednak, myślę, że to jest to, czego szukasz:

request.referer == books_url(page: params[:page])

aktualizacja:

ten sposób, nawet jeśli nie ma params [: page]. To nadal będzie działało poprawnie.

+0

dzięki za odpowiedź. jednak strona 4 jest tylko przykładem, może to być strona 7 lub w ogóle nie może zawierać param strony. więc wyraźnie strona kodowa 4 nie jest tym, czego chcę. –

+0

Pomyślałem, ale to był tylko przykład. można użyć 'request.referer == books_url (page: params [: page])', w ten sposób, nawet jeśli nie ma żadnych parametrów [: page], to działałoby zgodnie z przeznaczeniem. Spróbuj. –

0

Rejestracja recognize_path został przestarzały, jest to inny sposób robienia tego:

Nazwij swoją trasę w konfiguracji tras używając as kluczowe:

get 'foo/bar' => 'foo#bar', as: :foo_bar 

Następnie można wykonać sprawdzenie takiego:

if URI(request.referer).path == foo_bar_path 
    do_something() 
end 
Powiązane problemy