2012-01-20 18 views
10

Mam trasy takie jak poniżej, aby usunąć/wyświetlić użytkownika.Sposób kodowania (.) Kropka w Url Rails

map.connect 'developer/:user_name/delete',:controller=>"developers",:action=>"delete",:method=>:delete 

map.connect 'developer/:user_name/list',:controller=>"developers",:action=>"list",:method=>:get 

Wymieniając użytkownikowi poprzez zakodowanie kropka z% 2E, widzę odpowiedzi sukces

http://localhost:3000/developer/testuser%2Ehu/list 

ale podczas próby usunięcia użytkownika, który zawierający kropki (.), Zgłasza błąd 404 .

http://localhost:3000/developer/testuser%2Ehu/delete, how to fix this issue. 

Odpowiedz

2

Kropka nie jest domyślnie dozwolona w routingu Railsów, ponieważ kropka jest uważana za przedłużenie strony. Powinieneś unikać kropek w adresach URL.

Jednak w twoim przypadku możesz poinstruować Railsy, ​​aby wzięły pod uwagę kropkę parametru :user_name przekazującą wyrażenie regularne.

map.connect 'developer/:user_name/list', :controller => "developers", :action => "list", :method=> :get, :user_name => /[\w.]+/ 

PS. Z powodu map.connect używasz bardzo starej wersji Railsów (Railsy < 3). Powinieneś uaktualnić swoją aplikację.

0

Czy robisz DELETE request do adresu URL usuwania? Zauważ, że trasa jest zdefiniowana jako :method=>:delete, więc oczekuje na żądanie DELETE (nie GET).

+0

Usunąłem również metodę usuwania, a następnie próbowałem, ale bez powodzenia – loganathan

18

Avdi Grimm pisał na ten temat: http://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go-a-little-bit-insane/

będziemy chcieli zrobić coś takiego (pełny kredyt avdi)

resources :users, :constraints => { :id => /.*/ } do 
    resources :projects 
    end 

commenter na stanowisko mówi, można również zrobić:

resources :users, :id => /.*/ 
+0

Komentator miał rację;) –

+1

+1 'resources: users,: id => /.*/' works –

+2

To nie ma znaczenia, jeśli masz inny/w adresie URL, na przykład '/ search/hello + world/page/20'. Może lepiej pójść ze wszystkim oprócz a/z '/ [^ /] + /' – Tallboy

7

Po prostu miałem podobny problem, mój adres strony wyszukiwania to/search/search_term. Gdy search_term miał kropkę, Railsy interpretowały ją jako format żądania. Jeśli próbowałem wyszukać book.html, to faktycznie szukałem książki, ponieważ Railsy interpretowały html jako format. Nierozpoznany format zwróci błąd.

W moim przypadku pierwsze rozwiązanie Avdi Grimm nie zadziałało, ponieważ moje wyszukiwanie zostało podzielone na strony, a numer strony jest również podany w url (/ search/book/2). Rozwiązaniem dla mnie było zaakceptowanie wszystkiego poza slashiem dla search_term (ostatnie rozwiązanie z posta Avdiego Grimm'a):

zasoby: użytkownicy,: więzy => {: id =>/[^ \ /] + /}

+1

Najbardziej lubię twoją odpowiedź, chociaż myślę, że powinno to być '/ [^ \ /] + /' – Tallboy

+0

Dzięki, faktycznie wpisałem backslash, ale nie pojawił się na stronie. Musiałem wpisać 2 ukośniki odwrotne, aby pokazać 1. –

Powiązane problemy