如何访问belongs_to属性的父属性



我有以下模型:

class League < ApplicationRecord
has_many :games
end
class Game < ApplicationRecord
belongs_to :league
end

在我的用户的show.html.erb中,我试图通过这个片段game.league.title显示用户的游戏和与游戏相关的联赛,这是视图:

<div class="hidden text-center" id="tab-settings">
<% current_user.games.each do |game| %>
<ul>
<li class="w-1/2 mb-4 text-left border-2 rounded-md border-coolGray-900">
<p class=""><%= game.start_time&.strftime("%a %b %d, %Y %l:%M%P")  %> - <%= game.end_time&.strftime("%l:%M%P")  %></p>
<p class="mb-2"><%= game.league.title %> - <%= game.home_team %> vs <%= game.away_team %></p>
</li>
</ul>
<% end %>
</div>

game.league.title返回undefined method "title" for nil:NilClass错误;然而,当我进入控制台时,game.league.title查询得很好。

按照这里给出的建议,我在视图中尝试了以下操作:

<p class="mb-2"><%= game.league.try(:title) %> etc...</p>

,它工作得很好。

为什么game.league.try(:title)工作,但game.league.title返回一个错误?

你的数据不好。如果您希望能够调用game.league而没有潜在的nil错误,则需要将games.league_id列定义为NOT NULLGame.where(league_id: nil)将为您提供一个带有null的记录列表。

自Rails 5以来,belongs_to默认情况下对列应用存在验证。但是,如果您使用任何绕过验证的方法,这并不能防止空值潜入。或者如果记录是在Rails之外创建的,甚至是在旧版本的Rails中。

如果你想让league为空,你可以使用安全导航操作符:

<p class="mb-2"><%= game.league&.title %> etc...</p>

Object#try是一个ActiveSupport方法,它早于Ruby 2.3中引入的安全导航操作符。虽然它确实有其用途,但通常应该优先使用操作符。

你也可以使用Module#delegate:

class Game
# ...
delegate :title, to: :game, allow_nil: true, prefix: true
end
<p class="mb-2"><%= game.league_title %> etc...</p>

相关内容

  • 没有找到相关文章

最新更新