Требуют ли логические значения дополнительного синтаксиса в случае, когда / затем операторы? - PullRequest
1 голос
/ 04 марта 2012

У меня есть простое утверждение:

  class_name = case link_path
    when current_page?(jobs_path)               then 'current'
    when current_page?(open_estimates_path)     then 'current'
    when current_page?(tasks_path)              then 'current'
    when current_page?(calendar_dispatch_path)  then 'current'
  end
  debugger

В точке останова я могу спросить, current_page?(tasks_path), и она вернется true.

Затем я спрашиваю class_name, и он возвращает nil.

Какую синтаксическую ошибку я здесь делаю?

ruby ​​1.9.2p136

Рельсы 3.0.10

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Оператор case не делает то, что вы думаете, что он делает.Он сравнивает тему со всеми значениями, указанными в ветвях when, и возвращает значение первого соответствующего значения.Например:

color = case num_color
          when 1 then 'red'
          when 2 then 'green'
          when 3 then 'blue'
        end

Вы указываете link_path в качестве субъекта, поэтому он сравнивает link_path с каждым логическим значением в ваших when ветвях.Поскольку link_path, вероятно, не является логическим значением, ни одна из ветвей не будет оценена.Может быть, вы хотите что-то вроде этого:

class_name = current_page?(link_path) ? 'current' : ''

Это установит class_name в "current", если link_path текущая страница, в противном случае "".

1 голос
/ 04 марта 2012

Вы сравниваете логическое значение с link_path, поэтому ни один из случаев не будет сопоставлен. Почему бы не использовать if / elsif вместо этого?

1 голос
/ 04 марта 2012

Вы сравниваете строку с логическим значением.

link_path сравнивается с каждым значением, введенным в where, пока не будет найдено совпадение. Здесь, очевидно, нет совпадения.

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