Rails по маршруту, как / books /: slug,: to => 'books # show', slug: /.*?/, что делает slug: /.*?/? - PullRequest
3 голосов
/ 04 марта 2020

Я натолкнулся на маршрут типа /books/:slug, :to => 'books#show', slug: /.*?/ в приложении, над которым я работал. Мне интересно, что эта часть делает slug: /.*?/?

1 Ответ

1 голос
/ 04 марта 2020

Это ошибочная попытка пробить.

Создает маршрут, который соответствует:

/books/1
/books/abcd-absc

Но не:

/books/1/2
/books/abcd-absc/2

slug: /.*?/ полностью бессмысленное ограничение регулярных выражений, поскольку .* соответствует всему.

Конечный результат - это маршрут, который делает то же самое, что и GET /books/:id, генерируемый обычным resources :books, за исключением того, что параметр теперь называется :slug (woopty do!) - главная причина, по которой он настолько ошибочен, состоит в том, что этот маршрут будет конфликтовать с первым.

Вы действительно можете просто сделать простую перебивку, которая ищет запись по id или слагу с помощью:

@book = Book.where(id: params[:id]).or(Book.where(slug: params[:id])).first!
...