【问题标题】:ActionView::Template::Error (undefined method `FirstName' for nil:NilClass):ActionView::Template::Error(nil:NilClass 的未定义方法 `FirstName'):
【发布时间】:2017-03-02 23:31:50
【问题描述】:

我的注册和参赛者模型之间有一个相当简单的关联。

class Contestant < ActiveRecord::Base
   has_many :registrations
end

class Registration < ActiveRecord::Base
  belongs_to :contestant
end

我正在尝试从我的注册索引页面中引用参赛者的姓名。

 <tbody>
  <% @registrations.each do |registration| %>
      <tr>
        <td><%= registration.contestant.FirstName%></td>
      </tr>
  <% end %>
  </tbody>

访问页面产生

ActionView::Template::Error (undefined method `FirstName' for nil:NilClass):

我正在使用 activerecord 4.2.6 (Rails 4.2.6) 运行 Ruby-2.3.3-p222。我也尝试过 ruby​​-2.2.4-p230 并得到相同的结果。不同的是,我的用户和角色之间存在类似的关联。我可以毫无问题地拨打&lt;%= user.role.name %&gt;。我已经在两者之间反映了我的逻辑,我不知道为什么。谢谢大家的见解。

【问题讨论】:

    标签: ruby ruby-on-rails-4 activerecord


    【解决方案1】:

    这里的问题是 (99%) 并非所有 @registrations 都关联了 contestant,因此您遇到了错误。

    两种选择:

    1) 仅显示带有关联contestants@registrations

    @registrations.joins(:contestant).each...
    

    2) 使用try 避免错误:

    registration.contestant.try(:FirstName)
    

    【讨论】:

    • 啊,你是对的! “registration.contestant.try(:FirstName)”显示空白值。这很令人困惑,因为我引用了正确的参赛者 ID。另一个要解决的谜团,但这让我朝着正确的方向前进。谢谢!
    • @EDPittore 没有问题。只需检查ids = @registrations.joins(:contestant).pluck('registrations.id') Registration.where(id: ids) - 这将是拥有contestant 的人的列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多