Ruby: Regex в кейсах - PullRequest
       8

Ruby: Regex в кейсах

4 голосов
/ 29 марта 2011

Я новичок в Ruby.Я пытаюсь выяснить, как написать вложенную инструкцию case.Вот пример того, что я пытаюсь сделать:

# cucumber, webrat paths.rb

  def path_to(page_name)

    case page_name

    when /the "?(.*)"? event registration homepage/ then
      case $1
      when '2011 CIO GL Global'  then '/event/index/id/236'
      when '2011 CIO IS Chicago' then '/event/index/id/275'
      when '2011 CIO ES Denver'  then '/event/index/id/217'
      when '2011 CIO ES Vancouver, BC' then '/event/index/id/234'
      else
        raise "Can't find mapping for \"#{$1}\" to a path.\n" +
          "Now, go and add a mapping in #{__FILE__}"
      end

    when /the contact match verification page/
      '/attendee/user-verification'
    end
  end

В моем файле возможностей написано:

When I go to the "2011 CIO IS Chicago" event registration homepage

На этом шаге происходит сбой, поскольку он вызывает исключение, упомянутое выше,хотя я определил это в моем изложении выше.Что я делаю не так?

Ответы [ 5 ]

4 голосов
/ 29 марта 2011

Да, второй знак вопроса сбивает с толку регулярное выражение.

Выражение:

.*b?

может соответствовать строке «axb» двумя способами, либо с. *, Соответствующим всему элементу, либо с. *, Соответствующим 'ax' и 'b?' соответствует «б». Алгоритм регулярных выражений «жадный» - он предпочитает сопоставлять столько, сколько может, как можно раньше.

Я бы переписал регулярное выражение как:

    when /the "?([^"]*)"? event registration homepage/ then

, чтобы убедиться, что $ 1 не заканчивается двойными кавычками ...

1 голос
/ 29 марта 2011

Изменить

 when /the "?(.*)"? event registration homepage/ then

на

 when /the "?(.*)" event registration homepage/ then
1 голос
/ 29 марта 2011

Это работает для меня. Как вы это тестируете?

Обновление: Ага, это потому, что ваше регулярное выражение соответствует конечной кавычке, поэтому $ 1 заканчивается кавычкой, которой нет в вашем внутреннем регистре.

Есть несколько способов исправить это.

  1. Вы можете соответствовать "?[^"]*"?
  2. Селекторы для внутреннего регистра могут заканчиваться на ..."?'
  3. Вы можете использовать не жадные совпадения: "?(.*?)"?.
0 голосов
/ 29 марта 2011

Я бы подошел к этому немного по-другому. В вашей функции огурца, я предлагаю изменить формулировку так:

When I go to the registration homepage for the event named "2011 CIO IS Chicago"

А в вашем paths.rb файле я бы обработал все события одним регулярным выражением, например так:

when /the registration homepage for the event named "?(.*)"?/ then
  event = Event.find_by_name($1)
  raise "could not find an event with name: #{$1}" if event.blank?
  event_path(event) 
  # or create the route manually like so:  
  # "event/index/id/#{event.id}"

Это зависит от вашей Event модели, имеющей метод, который может найти событие по его имени (в данном случае я предположил find_by_name), и ресурсный маршрут, настроенный для :events.

0 голосов
/ 29 марта 2011

Проблема в вашем регулярном выражении.Попробуйте удалить последний ?, так как " является необязательным, а жадный поиск в начале (.*) ставит его в соответствие $1.

Наблюдение:

> s = 'the "2011 CIO IS Chicago" event registration homepage'
> /the "?(.*)"? event registration homepage/.match s #=> <MatchData "the \"2011 CIO IS Chicago\" event registration homepage" 1:"2011 CIO IS Chicago\"">
> $1 #=> "2011 CIO IS Chicago\""
> /the "?(.*)" event registration homepage/.match s #=> #<MatchData "the \"2011 CIO IS Chicago\" event registration homepage" 1:"2011 CIO IS Chicago">
> $1 #=> "2011 CIO IS Chicago"

Редактировать: если вы хотите, чтобы " был необязательным, вам, вероятно, потребуется сделать что-то вроде: (?:"(.*)"|(.*)).И тогда вам нужно будет использовать нулевую охрану, чтобы узнать, какая ссылка возвращается.$1 || $2.

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