Добавить ограничение на маршрут, чтобы исключить определенное ключевое слово - PullRequest
8 голосов
/ 27 октября 2010

Я использую Rails и хочу использовать в маршруте противопоказание, чтобы исключить этот маршрут, если ключевое слово "инцидент" находится где-то в URL.

Я использую rails3.

Вот мои существующие маршруты.

match ':arg', :to => "devices#show", :constraints => {:arg => /???/} 

Мне нужно поместить что-то в ограничения, чтобы оно не совпадало, если слово «инцидент»есть.

Спасибо

Ответы [ 3 ]

7 голосов
/ 11 апреля 2013

Вместо того, чтобы сгибать регулярные выражения так, как это не предназначено, я предлагаю этот подход:

class RouteConstraint
  def matches?(request)
    not request.params[:arg].include?('incident')
  end
end

Foo::Application.routes.draw do
  match ':arg', :to => "devices#show", :constraints => RouteConstraint.new
  ...

Это намного более многословно, но, в конце концов, я думаю, более элегантно.

6 голосов
/ 01 января 2011
(?!.*?incident).*

может быть тем, что вы хотите.

Это в основном тот же вопрос, что и Как отрицать определенное слово в регулярном выражении? .Пойди туда для более подробного ответа.

2 голосов
/ 22 ноября 2016

Добавление на @Johannes ответа для рельсов 4.2.5:

config / rout.rb (в ОЧЕНЬ конце)

constraints(RouteConstraint) do
  get "*anythingelse", to: "rewrites#page_rewrite_lookup"
end

конфиг / Инициализаторы / route_constraint.rb

class RouteConstraint
  def self.matches?(request)
    not ["???", "Other", "Engine", "routes"].any? do |check|
      request.env["REQUEST_PATH"].include?(check)
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...