rails ams,nil:NilClass 的嵌套模型未定义方法`'

rails ams, Nested models undefined method `' for nil:NilClass

我有以下型号:

class Appeal < ActiveRecord::Base
  belongs_to :applicant, :autosave => true
  belongs_to :appealer, :autosave => true
end

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true
end

class Applicant < ActiveRecord::Base
  has_many :appeals
end

我想要的是让每个上诉人都持有他上次上诉

申请人的参考

所以我将 Appealer 模型修改为:

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true

  def last_applicant
    return self.appeals.last.applicant
  end
end

但我收到错误:

undefined method `applicant' for nil:NilClass

奇怪的是,如果我调试它(​​通过 RubyMine - Evaluate Expression)我可以获得申请人。

如果我尝试获得最后的上诉:

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true

  def last_appeal
    return self.appeals.last
  end
end

一切正常。

我正在使用 active-model-serializer,也尝试在序列化器中执行此操作(我实际上需要在特定调用中使用此值 - 而不是整个模型)但它也没有遇到相同的错误。

AMS代码:

class AppealerTableSerializer < ActiveModel::Serializer
  attributes :id, :appealer_id, :first_name, :last_name, :city
  has_many :appeals, serializer: AppealMiniSerializer

  def city
    object.appeals.last.appealer.city
  end

end

我的问题: 如何在 JSON 中获取嵌套对象属性? 我做错了什么?

编辑: 我的控制器调用:

class AppealersController < ApplicationController
  def index
    appealers = Appealer.all
    render json: appealers, each_serializer: AppealerTableSerializer, include: 'appeal,applicant'
  end
end

我试过包含和不包含,还是不行

也许我遗漏了什么,因为这看起来您的 Appealer 记录还没有任何上诉。

在这种情况下,此代码

def last_appeal
  return self.appeals.last
end

Will return nil,不会引发任何错误。但是如果你调用这个

def last_applicant
  return self.appeals.last.applicant
end

return self.appeals.last 为 nil,您尝试对 nil 对象而不是 Appeal 对象调用 applicant 方法。

要修复它,只需添加检查 nil

class Appealer < ActiveRecord::Base
  has_many :appeals, :autosave => true

  def last_applicant
    last = self.appeals.last

    if last.nil?
      return nil
    else
      return last.applicant
    end
  end
end