每当你得到一个关于nil类未定义的错误,它应该是一个直接的信号给你,问题是你调用方法的变量,而不是你调用的方法。换句话说,因为它说nil
没有update
方法,所以你的重点应该放在实际上为零的变量上。这里的问题:为什么invite
返回nil
而不是关系?
由于您正在使用自定义类方法来创建关系,所以我猜测您并没有让它返回正确的对象。它应该看起来像这样:
def self.create_invitation(event, user, something_else = nil)
rel = InvitationRel.new(from_node: event, to_node: user)
if rel.save
rel
else
# return an error, maybe rel.errors.full_messages?
end
end
然后你的控制器需要检查rel是否被实际创建正确。
event = Event.find(params[:event])
invite = Invite.create_invitation(event, current_user, nil) #creates relationship
if invite.neo_id.nil?
# the rel did not create correctly, neo_id is only present on persisted objects
else
invite.update(interested: params[:interest])
end
这对我来说感觉就像你正在解决这个问题很长的路要走。你并不需要单独的关系的创建和设置interested
属性,你可以做它在一个调用DB:
event = Event.find(params[:event])
invite = InviteRel.new(from_node: event, to_node: current_user, interested: params[:interest])
if invite.save?
# rel was created, move on
else
# something wrong in the rel, figure out what it was
end
既然你知道你总是要创建interested
财产,这看起来像是向模型添加验证的好地方,以确保该属性始终设置为create。
谢谢克里斯。 Ruby通常返回最后一个对象。如果你只是'InvitationRel.new(from_node:event,to_node:user).save',我想知道为什么没有返回关系对象。为什么我们需要明确地归还它?在我不知道的创作中有没有巧妙的? – Clam 2014-11-24 20:22:45
'save'不返回被调用的对象,它返回对象是否成功保存的布尔值。 'create'不会返回对象,但不会显示它是否成功。这就是为什么你看到'如果obj.save然后do_this else do_that''模式无处不在。 – subvertallchris 2014-11-24 20:54:59