в Синатре, как сделать фильтр «до», который соответствует всем маршрутам, кроме некоторых - PullRequest
28 голосов
/ 09 октября 2011

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

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

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

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

Ответы [ 3 ]

38 голосов
/ 10 октября 2011

с отрицательным прогнозом:

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

С pass:

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

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

2 голосов
/ 12 ноября 2012

То, что я сделал, чтобы сделать фильтр «прежде всего, кроме ...», использовал сплат, а затем запустил код в условиях сплат.перенаправление, которое не создало цикл перенаправления

1 голос
/ 09 октября 2011

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

например:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...