我的模型函数返回nil,而不是string

时间:2014-01-20 05:51:25

标签: ruby-on-rails

我有一个名为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作为回报。

为什么,我不应该获得“徽章”?

1 个答案:

答案 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_levelcase...when默认为badge块中定义的else。请注意,else阻止将对所有其他self.idnil执行。

3声明中检查nilwhen的另一种可能性是替换:

else
  "badge" 

with:

when 3, nil
  "badge"

但我假设您希望badge默认为包括3nil在内的所有其他值。