Ruby on Rails案例/交换机.如何匹配对象?

Bri*_*ian 14 ruby ruby-on-rails

我正在开发一个ruby on rails应用程序.对于会话控制器,我想使用案例来检查用户的帐户是否被锁定或被禁止.我试图使用类的对象作为案例,并使用何时检查属性.

例如,

user = Profile.find(1)
case user
when user.ban
  redirect_to()
when user.lock
  redirect_to()
else
  redirect_to()
end
Run Code Online (Sandbox Code Playgroud)

唯一的问题是不起作用.

这是什么工作:

case user.ban
when true
  redirect_to()
else
  redirect_to()
end
Run Code Online (Sandbox Code Playgroud)

关于如何使用开关检查用户对象是否被禁止或锁定的任何建议?

谢谢

Zep*_*ock 25

创建一个user.status方法,返回用户的状态,然后你可以这样做:

user = Profile.find(1)
case user.status
when "banned"
  redirect_to()
when "locked"
  redirect_to()
else
  redirect_to()
end
Run Code Online (Sandbox Code Playgroud)


Ama*_*dan 14

我喜欢@ Salil的回答; 但是,如果你真的喜欢case,你可以这样做:

case true
  when user.ban
    redirect_to()
  when user.lock
    redirect_to()
  else
    redirect_to()
end
Run Code Online (Sandbox Code Playgroud)

更新 Jörg说这也有效,他是对的!给他一些回答他的答案!(我也一样)

case
  when user.ban
    redirect_to()
  when user.lock
    redirect_to()
  else
    redirect_to()
end
Run Code Online (Sandbox Code Playgroud)

更新2012现在可以使用:

case user
  when lambda(&:ban)
    redirect_to()
  when lambda(&:lock)
    redirect_to()
  else
    redirect_to()
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 这不必要地复杂化.这有效的原因是`true === true`是完整的.但是`case`表达式的另一种形式,即简单地完全忽略了`true`,无论如何都已经做了同样的事情. (3认同)

Jör*_*tag 7

请忽略user:

user = Profile.find(1)
case
when user.ban
  redirect_to
when user.lock
  redirect_to
else
  redirect_to
end
Run Code Online (Sandbox Code Playgroud)

在Ruby中,case表达式有两种形式.在上面的表格中,它只是执行第一个分支,它评估一个值(即除了nil或之外的任何东西false).

另一种形式

case foo
when bar
  baz
end
Run Code Online (Sandbox Code Playgroud)

相当于

if bar === foo
  baz
end
Run Code Online (Sandbox Code Playgroud)