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
我有以下型号:
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