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

时间:2010-07-03 02:09:59

标签: ruby-on-rails ruby

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

例如,

user = Profile.find(1)
case user
when user.ban
  redirect_to()
when user.lock
  redirect_to()
else
  redirect_to()
end

唯一的问题是不起作用。

这是什么工作:

case user.ban
when true
  redirect_to()
else
  redirect_to()
end

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

谢谢

6 个答案:

答案 0 :(得分:24)

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

user = Profile.find(1)
case user.status
when "banned"
  redirect_to()
when "locked"
  redirect_to()
else
  redirect_to()
end

答案 1 :(得分:14)

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

case true
  when user.ban
    redirect_to()
  when user.lock
    redirect_to()
  else
    redirect_to()
end

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

case
  when user.ban
    redirect_to()
  when user.lock
    redirect_to()
  else
    redirect_to()
end

2012年更新现在可以使用:

case user
  when lambda(&:ban)
    redirect_to()
  when lambda(&:lock)
    redirect_to()
  else
    redirect_to()
  end
end

答案 2 :(得分:7)

请忽略user

user = Profile.find(1)
case
when user.ban
  redirect_to
when user.lock
  redirect_to
else
  redirect_to
end

在Ruby中,case表达式有两种形式。在上面的表格中,它只是执行第一个分支,它评估为一个值(即nilfalse除外)。

另一种形式

case foo
when bar
  baz
end

相当于

if bar === foo
  baz
end

答案 3 :(得分:2)

大笑,我喜欢阿马丹的回答。如果你真的想要一个case语句,你可能应该做Zepplock所说的(尽管可能会考虑用符号代替字符串),但根据你的用例,你需要一个更基于if语句的解决方案,比如Salil's。

无论如何,我以为我会投入并享受一些乐趣^ _ ^ 这是一个解决方案,它将与你所说的一起工作,它创建响应===的对象(使用什么case语句),然后他们调用感兴趣的方法(锁定或禁止)并返回它。您应该将它们放入某种配置或初始化程序中,或者在第一次调用后存储结果,以便保存性能(您的应用程序只需要创建一次这些对象)

user = Class.new do
  def ban() true end
  def lock() true end
end.new

def banned?
  ban_checker = Object.new
  def ban_checker.===(user) user.ban end
  ban_checker
end

def locked?
  lock_checker = Object.new
  def lock_checker.===(user) user.lock end
  lock_checker
end

case user
when banned?
  puts 'banned'
when locked?
  puts 'locked'
else
  puts 'default'
end

注意:我不是在提倡这个解决方案,因为它违反了封装。禁止应该在您的用户上定义和使用,但要使其工作,必须在封闭范围内定义。我主要是为了好玩而把它带来:)

答案 4 :(得分:0)

你可以像Zepplock说的那样做。但是对于给定的示例,以下是最好的方法(仅作为示例)

action_name = (user.ban)? "ban" : ( (user.lock)?  "lock" : "default")
redirect_to(:action => action_name)

答案 5 :(得分:0)

@Brian,切换案例的想法是你有一个接受动态值的变量,并根据几个常量值集来检查它。在您编写的代码段中,case语句包含动态值,如user.ban,它取决于您要检查的变量本身。使用开关盒的正确方法是@Zepplock如何演示。