我正在使用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
关于如何使用开关检查用户对象是否被禁止或锁定的任何建议?
谢谢
答案 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
表达式有两种形式。在上面的表格中,它只是执行第一个分支,它评估为一个值(即nil
或false
除外)。
另一种形式
case foo
when bar
baz
end
相当于
if bar === foo
baz
end
答案 3 :(得分:2)
无论如何,我以为我会投入并享受一些乐趣^ _ ^ 这是一个解决方案,它将与你所说的一起工作,它创建响应===的对象(使用什么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如何演示。