使用 Pundit 中的父资源授权
authorize with a parent resource in Pundit
我有一个 Campaign
模型,其中有很多 Applicants
。我目前正在将 Applicants 嵌套在 Campaigns 中。我正在尝试授权用户 applicants#index
根据他们是否是活动的所有者。
resources :campaigns do
..
resources :applicants do
..
end
end
在 Pundit 中保护 applicants#index
操作的最佳方法是什么?理想情况下,我想通过 @Campaign
进行授权。
class ApplicantsController < ApplicationController
def index
@applicants = Applicant.where(campaign: @campaign)
authorize @campaign
respond_with(@applicants)
end
但这导致 Pundit 寻找 campaign_policy
。
我可能会在 CampaignPolicy
上使用 show?
方法
authorize @campaign, :show?
其中 show?
(随心所欲...manage?
,等等...) 将是
def show?
record.user_id = user.id
end
仅仅因为显示的资源是申请人列表并不意味着您需要直接对他们进行授权。如果您的逻辑需要授权活动的所有者,请执行此操作。
最后,如果这在您的应用程序中是一些广泛、常见的事情,您可以考虑创建一些值对象来包装您当前的用户和活动。
class CurrentState < Struct.new(:user, :campaign); end
然后覆盖 pundit_user
方法。
def pundit_user
CurrentState.new(current_user, Campaign.find(params[:campaign_id])
end
请参阅 Pundit 文档中的 Additional Context。
我有一个 Campaign
模型,其中有很多 Applicants
。我目前正在将 Applicants 嵌套在 Campaigns 中。我正在尝试授权用户 applicants#index
根据他们是否是活动的所有者。
resources :campaigns do
..
resources :applicants do
..
end
end
在 Pundit 中保护 applicants#index
操作的最佳方法是什么?理想情况下,我想通过 @Campaign
进行授权。
class ApplicantsController < ApplicationController
def index
@applicants = Applicant.where(campaign: @campaign)
authorize @campaign
respond_with(@applicants)
end
但这导致 Pundit 寻找 campaign_policy
。
我可能会在 CampaignPolicy
show?
方法
authorize @campaign, :show?
其中 show?
(随心所欲...manage?
,等等...) 将是
def show?
record.user_id = user.id
end
仅仅因为显示的资源是申请人列表并不意味着您需要直接对他们进行授权。如果您的逻辑需要授权活动的所有者,请执行此操作。
最后,如果这在您的应用程序中是一些广泛、常见的事情,您可以考虑创建一些值对象来包装您当前的用户和活动。
class CurrentState < Struct.new(:user, :campaign); end
然后覆盖 pundit_user
方法。
def pundit_user
CurrentState.new(current_user, Campaign.find(params[:campaign_id])
end
请参阅 Pundit 文档中的 Additional Context。