Как кодировать (.) Точка в URL-адресах

У меня есть маршруты, как показано ниже, чтобы удалить/перечислить пользователя.

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

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

При перечислении пользователя путем кодирования точки с% 2E, я могу увидеть ответ успеха

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

Но при попытке удалить пользователя, который содержит Dot (.), выдает ошибку 404.

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

Ответ 1

Точка не разрешена по умолчанию в маршрутизации Rails, поскольку точка считается расширением страницы. Вы должны избегать использования точек в URL-адресах.

Однако в вашем случае вы можете указать Rails считать точку для параметра :user_name, передавая регулярное выражение.

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

PS. Из-за map.connect вы используете очень старую версию Rails (Rails < 3). Вы должны обновить свое приложение.

Ответ 3

У меня была аналогичная проблема, моя страница поисковой страницы -/search/search_term. Когда у search_term была точка, Rails интерпретировал ее как формат запроса. Если бы я попытался найти book.html, он действительно искал книгу, потому что Rails интерпретировал html как формат. Непризнанный формат возвращает ошибку.

В моем случае первое решение от Avdi Grimm не сработало, потому что мой поиск разбит на страницы, а номер страницы также находится в URL-адресе (/search/book/2). Решение для меня принимало все, кроме косой черты для search_term (последнее решение из сообщения Avdi Grimm):

ресурсы: users,: constraints = > {: id = > /[^ \/] +/}

Ответ 4

Вы выполняете запрос DELETE к URL-адресу удаления? Обратите внимание, что маршрут определяется с помощью :method=>:delete, поэтому он ожидает запроса DELETE (не GET).