Как кодировать (.) Dot в URL Rails - PullRequest
12 голосов
/ 20 января 2012

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

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

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

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

Ответы [ 4 ]

22 голосов
/ 20 января 2012

Авди Гримм писал на эту тему: 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 => /.*/
7 голосов
/ 08 февраля 2012

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

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

resources: users,: constraints => {: id => / [^ \ /] + /}

3 голосов
/ 20 января 2012

Точка не разрешена по умолчанию в маршрутизации 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). Вам следует обновить приложение. </p>

0 голосов
/ 20 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...