Я хочу поймать 2 похожих маршрута в одном блоке действий. В Rails5 я могу сделать это легко. Я сначала заявляю это:
get ':folder/:file' => 'get#index', :file => /.*/, :folder => /.*/
get ':file' => 'get#index', :file => /.*/
Это позволяет мне поймать :folder
столько, сколько папка может быть похожа на a/b/c/d...
и :file
в конце последнего имени файла. Второй также позволяет мне ловить только имена файлов. И оба маршрута нацелены на одно и то же действие.
Однако в Grape, поскольку он объявлен как блоки, а не маршрут к определениям методов, мне приходится писать один и тот же блок дважды...
Есть ли способ поймать как /as/many/folder/and/file.ext
, так и только /file.ext
в одном параметре маршрута? Я пробовал необязательные параметры, требования. Ни один из них не работал.
Причина, по которой я использую :folder/:file
(дважды регулярное выражение), заключается в том, что я могу получить :folder
параметр и :file
параметр отдельно, не разделяя их вручную.
get ':folder/:file', requirements: { file: /.*/, folder: /.*/ } do
# params[:folder] and params[:file]
end
get ':file', requirements: { file: /.*/ } do
# params[:file]. [:folder is empty.]
end
^^ Я хочу сделать их одним маршрутом. Если папка существует (вложенная), она будет захвачена в параметре папки, иначе папка будет нулевой.