Как кодировать (.) Точка в 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). Вы должны обновить свое приложение.
Ответ 2
Avdi Grimm написал на эту тему: 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/
Вы хотите сделать что-то вроде этого (полный кредит avdi)
resources :users, :constraints => { :id => /.*/ } do
resources :projects
end
Комментируя сообщение, вы также можете:
resources :users, :id => /.*/
Ответ 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).