我有方法current_user
。
此方法返回#<User id: 8, ... >
我还有两个来自User
的继承类:Trainer
和Client
我在User.rb
添加了方法:
def client?
self.class.name == "Client"
end
def trainer?
self.class.name == "Trainer"
end
但current_user.client?
和current_user.trainer?
总是返回false。
为什么会这样?我做错了什么?
答案 0 :(得分:1)
如果current_user.client?
和current_user.trainer?
始终返回false
,这可能意味着current_user
始终返回User
个实例,而不是Trainer
或Client
个实例。如果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