所以我正在尝试构建一个类似于主要Meteor页面上的Parties示例的应用程序。在缔约方应用程序中,您可以创建一个聚会并邀请其参与或公开。我想做的是改变它,即使它是一个公共聚会,你仍然需要通过点击按钮加入它。
我有这个工作,除了通过console.logs我已经发现它是不允许的,因为点击Join按钮的用户正在尝试更新Event但当前只有事件开始有权访问更新。
所以这是正确的
var currentUser = Meteor.userId();
var currentEventId = this._id;
Events.update(currentEventId, {$addToSet: { attendees: currentUser }}, function(error) {
console.log(error);
if (error) {
throwError(error.reason);
} else {
Router.go('eventPage', {_id: currentEventId});
}
但现在我需要改变它似乎
Events.allow({
update: ownsDocument,
remove: ownsDocument});
ownsDocument = function(userId, doc) {
return doc && doc.userId === userId;
}
所以我认为我需要更改更新,例如:
如果您不是用户,则需要加入或登录。如果您是用户但不是活动创建者,则可以将userId添加到与会者数组。如果您是活动创建者,则可以编辑活动。我只是不知道是否允许在允许更新功能或如何写它真的,因为我仍然是JS的新手。谢谢你的帮助!
答案 0 :(得分:0)
首先,请确保从insecure
删除.meteor/packages
包。
我建议只实施基本 allow
/ deny
规则。例如,所有者可以更新某些字段。
对于任何稍微复杂的事情,请使用Meteor.methods
。方法将忽略允许&拒绝规则,让你执行更复杂的行动。
方法总是在服务器端执行/确认,并且可以选择在客户端上进行“模拟”,以使其看起来好像是立即执行的!
例如,将当前登录用户添加到事件 -
的方法Meteor.methods({
'attendEvent': function(eventId){
// check they're logged in
check(this.userId, String);
// check the eventId isn't something un-expected
check(eventId, String);
// add the user to `attendees`, using `$addToSet` as each user can only attend once
Events.update({_id: eventId}, {$addToSet: { attendees: this.userId}});
}
});
然后,您可以在客户端上调用操作,如:
Template.myTemplate.events({
'click a[data-action="attendEvent"][data-event]': function(e){
// get the eventId from element data- however data could be available in this.eventId / this._id too!
var eventId = $(e.currentTarget).data('event')
Meteor.call('attendEvent', eventId)
}
});
答案 1 :(得分:0)
您可以修改allow()
功能以匹配您想要的逻辑。将您的update:
更改为:
update: function( userId, doc, fields, modifier ){
return ( doc && doc.userId === userId ) || ( userId && modifier === {$addToSet: { attendees: userId}} );
},
你可能还想在调用`Events.update()之前在客户端上添加if
来检查currentUser
,因为它会失败。