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无声地失败而不是引发错误.
顺便说一下,Ruby中的方法是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)
| 归档时间: |
|
| 查看次数: |
5063 次 |
| 最近记录: |