在红宝石中委托nil属性

时间:2014-05-12 18:31:55

标签: ruby-on-rails ruby postgresql

由于某些原因我不明白我在我的应用上运行某个页面时收到此错误消息:

Teamplayer#Plyr delegated to live_player.Plyr, but live_player is nil: #<Teamplayer id: 1, playerid: "2533033", teamid: "1", live_player_id: 253303, fteam_id: "1", created_at: "2014-05-12 13:57:49", updated_at: "2014-05-12 13:57:49">

在这一行:

<%= @teamplayer.Plyr %>

以下是我的Teamplayer模型的设置方法:

class Teamplayer < ActiveRecord::Base
belongs_to :live_player
belongs_to :fteam
    delegate :Plyr, to: :live_player
delegate :Team, to: :live_player
delegate :Nid, to: :live_player
delegate :name_team, to: :live_player
delegate :fanteam, to: :fteam

end

这是Liveplayer模型:

class LivePlayer < ActiveRecord::Base
has_many :fteams, through:  :teamplayers
end

以上是Fteam模型,如上所述:

class Fteam < ActiveRecord::Base
has_many :teamplayers
has_many :live_players, through: :teamplayers
end

我试图从live_player(来自名为live_players的表)获取字段Plyr,但它说live_player是空的。我不确定这部分是错的。我正在使用postgresql,但我认为这对它没有影响。

如果有人需要更多信息来帮助我,我会更乐意发布它

1 个答案:

答案 0 :(得分:20)

delegate有一个allow_nil选项,如果委托对象不存在,将在委托方法上返回nil

delegate :Plyr, to: :live_player, allow_nil: true

这基本上会让live_player.Plyr无声地失败,而不是引发错误。

顺便说一下,R​​uby中的方法是99.99999%的小写时间(有一些大写的内核方法),并且字符数没有限制(我会使用player而不是{{1为了便于阅读)。如果这是继承数据库上的列名,我会尝试纠正它。按照惯例,Rails使用小写的数据库表和列名,这可能会在以后引起一些奇怪的问题。

修改

在没有真正知道你需要如何使用它的情况下,通常我会建议使用Null Object模式来显示缺少的玩家条件(我发现更容易推理出代表虚无的对象而不是检查Plyr其他每一行)。创建一个名为nil的新类,它响应玩家所使用的相同方法,但是要明确说明没有玩家存在:

NullPlayer

不幸的是,我不知道使用Rails的标准委托来默认空对象的方法,所以要使用它,你需要做这样的事情:

class NullPlayer
  def name
    "[no player]"
  end

  # etc ...
end