使用Pundit中的父资源进行授权

时间:2015-06-09 11:33:20

标签: ruby-on-rails ruby-on-rails-4 pundit

我的Campaign模型有很多Applicants。我目前正在“广告系列”中嵌套申请人。我正在尝试根据用户是否为广告系列的所有者来授权用户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

1 个答案:

答案 0 :(得分:0)

我可能会在show?

上使用CampaignPolicy方法
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