在红宝石中委托nil属性

use*_*928 11 ruby postgresql ruby-on-rails

由于某种原因,我不理解我在我的应用程序上运行某个页面时收到此错误消息:

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">
Run Code Online (Sandbox Code Playgroud)

在这一行:

<%= @teamplayer.Plyr %>
Run Code Online (Sandbox Code Playgroud)

以下是我的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
Run Code Online (Sandbox Code Playgroud)

这是Liveplayer模型:

class LivePlayer < ActiveRecord::Base
has_many :fteams, through:  :teamplayers
end
Run Code Online (Sandbox Code Playgroud)

这是Fteam模型,因为它在上面提到:

class Fteam < ActiveRecord::Base
has_many :teamplayers
has_many :live_players, through: :teamplayers
end
Run Code Online (Sandbox Code Playgroud)

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

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

Zac*_*emp 28

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

delegate :Plyr, to: :live_player, allow_nil: true
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

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

class NullPlayer
  def name
    "[no player]"
  end

  # etc ...
end
Run Code Online (Sandbox Code Playgroud)

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

teamplayer.Plyr || NullPlayer.new
Run Code Online (Sandbox Code Playgroud)