Ответ 1
С отрицательным внешним видом:
before /^(?!\/(join|payment))/ do
# ...
end
С pass
:
before do
pass if %w[join payment].include? request.path_info.split('/')[1]
# ...
end
Или вы могли бы создать пользовательский макет.
У меня есть приложение Ruby Sinatra, и у меня есть код, который мне нужно выполнить на всех маршрутах, за исключением нескольких исключений. Как это сделать?
Если бы я хотел выполнить код на выбранных маршрутах (белый стиль), я бы сделал следующее:
['/join', "/join/*", "/payment/*"].each do |path|
before path do
#some code
end
end
Как мне это сделать наоборот (стиль черного списка)? Я хочу сопоставить все маршруты, кроме '/join'
, '/join/*'
и '/payment/*'
С отрицательным внешним видом:
before /^(?!\/(join|payment))/ do
# ...
end
С pass
:
before do
pass if %w[join payment].include? request.path_info.split('/')[1]
# ...
end
Или вы могли бы создать пользовательский макет.
Что я сделал, чтобы создать фильтр "before all, except...", использует splat, а затем запускает код в условиях splat.
before '/*' do
unless params[:splat] == 'nofilter' || params[:splat] == 'beta'
redirect '/beta'
end
end
Это позволило мне создать фильтр перед перенастройкой, который не создал цикл переадресации
Вы можете использовать регулярные выражения для маршрутизации в синатрах
например:
get %r{/hello/([\w]+)} do |c|
"Hello, #{c}!"
end
взято из здесь. там вы можете найти дополнительную информацию.
для создания и тестирования вашего регулярного выражения вы можете использовать http://rubular.com/