Подтвердить что ты не робот

В Sinatra, как вы делаете фильтр "before", который соответствует всем маршрутам, за исключением некоторых

У меня есть приложение Ruby Sinatra, и у меня есть код, который мне нужно выполнить на всех маршрутах, за исключением нескольких исключений. Как это сделать?

Если бы я хотел выполнить код на выбранных маршрутах (белый стиль), я бы сделал следующее:

['/join', "/join/*", "/payment/*"].each do |path|
    before path do
        #some code
    end
end

Как мне это сделать наоборот (стиль черного списка)? Я хочу сопоставить все маршруты, кроме '/join', '/join/*' и '/payment/*'

4b9b3361

Ответ 1

С отрицательным внешним видом:

before /^(?!\/(join|payment))/ do
  # ...
end

С pass:

 before do
   pass if %w[join payment].include? request.path_info.split('/')[1]
   # ...
 end

Или вы могли бы создать пользовательский макет.

Ответ 2

Что я сделал, чтобы создать фильтр "before all, except...", использует splat, а затем запускает код в условиях splat.

before '/*' do
  unless params[:splat] == 'nofilter' || params[:splat] == 'beta'
    redirect '/beta'
  end
end

Это позволило мне создать фильтр перед перенастройкой, который не создал цикл переадресации

Ответ 3

Вы можете использовать регулярные выражения для маршрутизации в синатрах

например:

get %r{/hello/([\w]+)} do |c|
   "Hello, #{c}!"
end

взято из здесь. там вы можете найти дополнительную информацию.

для создания и тестирования вашего регулярного выражения вы можете использовать http://rubular.com/