ruby-on-rails - 如何访问 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 NULL
. Game.where(league_id: nil)
将为您提供带有空值的记录列表。
由于 Rails 5belongs_to
默认情况下对列应用存在验证。但是,如果您使用任何规避验证的方法,这并不能防止空值潜入。或者,如果记录是在 Rails 之外创建的,或者甚至是在旧版本的 Rails 中创建的。
如果您希望联赛可以为空,您可以使用安全导航运算符:
<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>
推荐阅读
- java - 在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应
- loops - 你如何在方案中实现一个简单的列表迭代器?
- javascript - 使用 SyntaxError 调试 React/Flask 连接:位置 0 的 JSON 中的意外令牌 <
- javascript - 重构错误处理程序以递归重试失败的 api 调用
- java - Spring-boot mongodb - 如何将 MongoRepository 保存响应转换为自定义类并以 JSON 形式返回
- eclipse - Eclipse 因有问题的框架“C [libgtk-3.so.0+0x398e83] gtk_widget_hide+0x23”而崩溃 - 我需要更新一些库吗?
- scipy - 在 scipy 中模拟随机变量的函数
- php - 我需要从多对多关系数据中获取我的枢轴值
- javascript - Chrome 扩展 :: 试图理解 chrome.runtime.sendmessage 到 chrome.runtime.onMessage 的语法
- three.js - 在单击使用“new THREE.FontLoader”加载的文本时调用函数