Rails将case语句设计为if语句

时间:2014-08-21 11:39:55

标签: ruby-on-rails if-statement ruby-on-rails-4 devise switch-statement

在我的应用程序控制器中,我有after_sign_in_path_for(resource)方法在用户或管理员登录后更改登录路线。

我想改变用户登录路线,具体取决于他们是否有任何当前帖子,但我无法将其作为案例陈述或if语句使用。这是我目前所拥有的并且它有效;

     def after_sign_in_path_for(resource)
       case resource
       when Admin then admin_root_path
       when User then root_url
       end
    end

但是我想把它改成像这样的if语句(或者如果更容易的话就是case语句),但这不起作用......

 def after_sign_in_path_for(resource)
   if resource == User
     if current_user.posts.count == 1
       post_path(1)
     else
       root_url
     end
  elsif resource == Admin
    admin_root_path
  end
end

1 个答案:

答案 0 :(得分:0)

在Ruby中,case语句使用case equality operator ===。请考虑以下代码

>> User.new === User # false
>> User === User.new # true
>> User.new.is_a?(User) # true

case使用第二个代码检查是否相等。知道这一点,您可以将代码更改为

if resource.is_a?(User)
  ...
elsif resource.is_a?(Admin)
  ...
end

您也可以使用===,但is_a?更具可读性

if User === resource
  ...
elsif Admin === resource
  ...
end

还有另一种方法可以做到这一点,那就是获取资源的类

if resource.class.name == 'User'

如果你正在使用继承,请注意

class Foo; end
class Bar < Foo; end

bar = Bar.new

bar.is_a?(Foo) # true
Foo === bar # true