Как создать два маршрута в одном блоке в винограде?

Я хочу поймать 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

^^ Я хочу сделать их одним маршрутом. Если папка существует (вложенная), она будет захвачена в параметре папки, иначе папка будет нулевой.


person Dennis    schedule 11.12.2017    source источник


Ответы (2)


Ok. Я нашел ответ, пытаясь найти refdocs.

get '(:folder/):file', requirements: {  folder: /.*/, file: /.*/ } do

Это работает, как и ожидалось.

person Dennis    schedule 11.12.2017

Пример:

desc 'Create transaction'
params do
  requires :id, type: String
  requires :from_, type: String
end
post ['/:id/addresses/:from_/transactions', '/:id/transactions'] do

end

Маршруты:

/api/v1/wallets/:id/addresses/:from_/transactions  
/api/v1/wallets/:id/transactions
person artamonovdev    schedule 31.10.2019