Ruby on rails RubyonRails外壳/开关。如何匹配对象?

Ruby on rails RubyonRails外壳/开关。如何匹配对象?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在开发一个RubyonRails应用程序。对于会话控制器,我想使用一个案例来检查用户的帐户是否被锁定或禁止。我试图使用类的对象作为案例,并使用when来检查属性 比如说, 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

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

比如说,

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
关于如何使用开关检查用户对象是否被禁止或锁定,有什么建议吗

谢谢

创建一个user.status方法,返回用户的状态,然后您可以执行以下操作:

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

你可以照泽普洛克说的做。但对于给定的示例,以下是最好的方法(只是一个示例)


我喜欢@Salil的回答;但是,如果您确实喜欢
案例
,您可以这样做:

user = Profile.find(1)
case user.status
when "banned"
  redirect_to()
when "locked"
  redirect_to()
else
  redirect_to()
end
case true
  when user.ban
    redirect_to()
  when user.lock
    redirect_to()
  else
    redirect_to()
end
更新Jörg说这也行,他是对的!就他的答案给他投票!(我也会)

更新2012现在可以使用了:

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

@Brian,switch case的想法是,你有一个变量,它接受一个动态值,并根据一组常量值检查它。在您编写的代码中,case语句包含诸如user.ban之类的动态值,这取决于您试图检查的变量本身。使用开关盒的正确方法是@Zepplock演示的方式。

哈哈,我喜欢Amadan的答案。如果你真的想要一个case语句,你可能应该做Zepplock所说的(虽然可能考虑符号代替字符串),但是根据你的用例,你需要一个更多的if语句为基础的解决方案,比如Salil的

。 不管怎么说,我想我也会加入进来玩一玩^_^ 下面是一个解决方案,它将处理您所说的内容,它创建响应==(case语句使用的内容)的对象,然后调用感兴趣的方法(lock或ban)并返回它。您可能应该将它们放入某种配置或初始值设定项中,或者在第一次调用后存储结果,以节省性能(您的应用程序只需要创建这些对象一次)


注意:我并不提倡这种解决方案,因为它违反了封装。应该在您的用户上定义和使用“禁止”,但要使其起作用,必须在封闭范围内定义它。我提出这一点主要是为了好玩:)

只需将
用户排除在外即可:

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

我想当
s时,
的顺序非常重要,不是吗?不管怎样,+1代表如此惊人的想法。这是不必要的复杂。这样做的原因是
true===true
是真实的。但是另一种形式的
大小写
表达式,即完全忽略
true
,已经做了同样的事情。@Jörg:Huh。不知道。你每天都在学习。谢谢你,约格!哈哈,我刚刚弄明白了更新,然后回来发布。Jorg提前知道了这一点,击败了我:PCame在这里查找
update2012
解决方案,但不幸的是,它看起来很神秘。感谢您的回复。我发现Zepplock的答案对我的应用程序最有用。唯一的区别是我在方法和案例中使用了符号。下面是我编写的方法:def status if self.ban return:ban end if self.lock return:lock endend@Brian:只是为了修饰一点-如果函数返回布尔值,最好用问号命名。此外,即使post修饰语可能被滥用并损害易读性,在这种情况下,我认为它们可以改善它:
def status;返回:如果禁用,则禁用?;返回:如果锁定,则锁定?结束
我在RoR工作了8年,但仍然需要寻找“rails case syntax”xD,不知道为什么,但一直在尝试使用case;匹配;
if bar === foo
  baz
end