我有一个名为Heat的模型,其中有很多用户
# id :integer not null, primary key
# level :string(255)
我想定义一个方法badge_level,它根据Heat Id
输出一个给定的字符串 def badge_level
"badge" # if id is 3, or nil
"badge badge-important" if self.id == 1
"badge badge-warning" if self.id == 2
"badge badge-info" if self.id == 4
"badge badge-inverse" if self.id == 5
end
但是,当我运行Heat.find(3).badge_level(或任何id)时,我得到nil作为回报。
为什么,我不应该获得“徽章”?
答案 0 :(得分:2)
那是因为方法的最后一行是return
语句,在你的情况下是"badge badge-inverse" if self.id == 5
。因此,如果self.id
不是5
,那么您的方法将始终返回nil。
看起来你想要返回该方法中的每个语句。我认为case...when
更适合这种情况:
def badge_level
case self.id
when 1
"badge badge-important"
when 2
"badge badge-warning"
when 4
"badge badge-info"
when 5
"badge badge-inverse"
else
"badge"
end
end
使用更新后的badge_level
,case...when
默认为badge
块中定义的else
。请注意,else
阻止将对所有其他self.id
和nil
执行。
在3
声明中检查nil
和when
的另一种可能性是替换:
else
"badge"
with:
when 3, nil
"badge"
但我假设您希望badge
默认为包括3
和nil
在内的所有其他值。