当/ then语句时,布尔值是否需要额外的语法?

时间:2012-03-04 13:41:17

标签: ruby-on-rails

我有这个简单的案例陈述:

  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

Rails 3.0.10

3 个答案:

答案 0 :(得分:2)

case语句不符合您的想法。它将主题与when分支中声明的所有值进行比较,并返回第一个匹配的值。例如:

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

您将link_path作为主题,因此会将link_pathwhen分支中的每个布尔值进行比较。由于link_path可能不是布尔值,因此不会评估任何分支。也许你想要这样的东西:

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

如果class_name是当前页面,则会将"current"设置为link_path,否则设置为""

答案 1 :(得分:1)

您正在将字符串与布尔值进行比较。

link_path会与您在where中输入的每个值进行比较,直到找到匹配为止。显然,这里没有匹配。

答案 2 :(得分:1)

您正在将布尔值与link_path进行比较,因此不会匹配任何案例。为什么不使用if / elsif?