因此,在我的Meteor应用程序中,用户可以将自己添加到比赛中或自行删除。请参阅以下Meteor.methods代码:
update_users_array: ( id, user ) ->
if RaceList.find( _id: id, users: $elemMatch: _id: user._id ).fetch().length > 0
RaceList.update id, $pull: users: user
else
RaceList.update id, $push: users: user
以下是调用此方法的模板事件助手:
Template.race.events
'click .join-race-btn': ( event ) ->
Meteor.call 'update_users_array', @_id, Meteor.user()
只要用户不离开页面,但只要他们离开页面并返回并尝试删除自己,它就不再有效了。代码正在执行,但用户未被删除。
真的不确定我在哪里出错了所以任何帮助都会受到赞赏。
感谢。
答案 0 :(得分:1)
我不完全确定为什么会失败。这可能是因为您正在存储用户对象而不是ID,并且它们的字段必须完全相同才能使更新生效。我强烈建议您重新设计架构以使用ID数组而不是对象。它的空间效率更高,避免了移除时的平等问题,并且通常是最佳实践。
我会按如下方式重写方法:
update_users_array: (id) ->
# ensure id is a string
check id, String
# you must be logged in to call this method
unless @userId
throw new Meteor.Error 401, 'You must be logged in'
# fetch the RaceList we are about to modify
raceList = RaceList.findOne id
# ensure this is a valid list
unless raceList
throw new Meteor.Error 404, 'The list was not found'
if _.contains raceList.users, @userId
# remove this user from the list
RaceList.update id, $pull: users: @userId
else
# add this user to the list and prevent duplicates
RaceList.update id, $addToSet: users: @userId