Чому маршрути з крапкою в параметрі не збігаються?


77

У мене є маршрут для моїх користувачів /iGEL/contributions, який працює чудово. Але зараз користувач зареєструвався з таким ім’ям, як „A.and.B.“, і тепер маршрут не відповідає, оскільки ім’я містить крапки.

Мій маршрут:

get "/:user/contributions" => 'users#contributions'

Будь-які ідеї?

Відповіді:


140

Дивіться синє інформаційне вікно тут :

За замовчуванням динамічні сегменти не приймають крапок - це тому, що ця точка використовується як роздільник для відформатованих маршрутів. Якщо вам потрібно використовувати крапку в динамічному сегменті, додайте обмеження, яке перевизначає це - наприклад, :id => /[^\/]+/дозволяє будь-що, крім скісної риски.

Наприклад, це буде:

get "/:user/contributions" => 'users#contributions', :constraints => { :user => /[^\/]+/ }

4
Дякую. Викладений вами регулярний вираз має помилкову помилку, це має бути / [^ \ /] + /, а не / [^ \ /] / +. Але це помилка в оригінальному посібнику.
iGEL

Синтаксис буде таким, як наприклад: get "/: user / doprinos" => 'users #
вноски',:

/.*/також працює, я недостатньо добре знаю регулярний вираз, щоб сказати різницю.
Kris

отримав більше деталей @RyanGlen? він працює на вказаному рубіні на рейках versio.
Zabba

1
У Rails 6 мені довелося встановити, format: false, defaults: {format: 'html'} щоб Rails припинив спроби розглядати сегмент крапок як розширення файлу із зазначенням типу вмісту.
Девід

8

Якщо ваш змінний сегмент є останнім, тоді використання [^\/]регулярного виразу також з'їсть формат. У такому випадку скоріше використовуйте:

/([^\/]+?)(?=\.json|\.html|$|\/)/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.