如何解决使用 CanCanCan
我在多对多关系中有 3 个模型:
class User < ApplicationRecord
has_many :participations
has_many :attended_events,through: :participations,source: :event
end
class Event < ApplicationRecord
has_many :participations
has_many :participants,source: :user
end
class Participation < ApplicationRecord
belongs_to :user
belongs_to :event
end
我想授权用户创建新的参与,前提是他还不是活动的一部分。 换句话说,只有当用户还没有与同一事件相关联的参与时,他才能创建参与。
这是我已经尝试过的,但即使用户还不是活动的参与者,访问也总是被拒绝:
cannot [:new,:create],Participation,id: user.participation_ids
cannot [:new,event_id: user.attended_event_ids
cannot [:new,event: { id: user.attended_event_ids }
我确保已在 Participation#new 操作中加载了正确的 @event
。
我假设我的 event
语句中的 event_id
/ cannot
指的是它。这是一个正确的假设吗?
编辑:
我意识到我忘记定义未达到条件时实际授权 new
操作的能力
can :new,Participation
cannot :new,event_id: user.attended_event_ids
# This cannot statement works too
# cannot :new,event: { id: user.attended_event_ids }
但现在用户总是可以创建新的参与(好像没有 cannot
语句一样)。
我设法让它像这样工作:
在参与控制器中:
class ParticipationsController < ApplicationController
# load_and_authorize_resource only: [:new] removed this line
def new
@participation = Participation.new(event: @event) # added this line
authorize! :new,@participation # added this line
end
end
所以我是手动完成的,这并不理想。我认为 event_id
不会自动引用我在 Participation#new 操作中加载的 @event
...
如何使用 load_and_authorize_resource
方法而不是手动执行此操作?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。