Ruby祖先链。找孩子班

时间:2014-03-03 22:19:33

标签: ruby-on-rails ruby

我有方法current_user

此方法返回#<User id: 8, ... >

我还有两个来自User的继承类:TrainerClient

我在User.rb添加了方法:

def client?
  self.class.name == "Client"
end

def trainer?
  self.class.name == "Trainer"
end

current_user.client?current_user.trainer?总是返回false。

为什么会这样?我做错了什么?

3 个答案:

答案 0 :(得分:1)

如果current_user.client?current_user.trainer?始终返回false,这可能意味着current_user始终返回User个实例,而不是TrainerClient个实例。如果current_user始终返回User个实例,self.class.name将始终为"User",这将为client?trainer?返回false。

答案 1 :(得分:1)

适合我。我希望你实际上是在实例化User类。查看您是否可以找到实例化用户的位置,或者是否从数据库中检索它,在这种情况下检查:http://railscasts.com/episodes/394-sti-and-polymorphic-associations或相关的单表继承讨论。

class User
  def client?
    self.class.name == "Client"
  end

  def trainer?
    self.class.name == "Trainer"
  end

  def user?
    self.class.name == "User"
  end

end

class Trainer < User
end

class Client < User
end

puts Client.new.client?
puts Client.new.trainer?
puts Client.new.user?

puts Trainer.new.client?
puts Trainer.new.trainer?
puts Client.new.user?

输出:

true
false
false
false
true
false

答案 2 :(得分:1)

其他人已经回答了代码可能失败的可能原因。我要补充一点,这是可怕的 OO代码!一个对象永远不会需要检查自己的类!决不!让方法调度员完成它的工作,这就是它的用途!

class Client < User
  def client?;  true  end
  def trainer?; false end
end

class Trainer < User
  def client?;  false end
  def trainer?; true  end
end