Attachment Policy Extension for Pundit
When using Pundit, it's common to define permissions for each attachment action (e.g., upload, delete, download) individually. This can lead to repetitive code like:
ruby
def upload_logo?
update?
end
def delete_logo?
update?
end
def download_logo?
update?
endTo streamline this process, you can extend your ApplicationPolicy with a helper method that dynamically handles attachment permissions.
Step 1: Add the method_missing Helper to ApplicationPolicy
This method intercepts calls to undefined policy methods that follow a specific pattern and delegates them to a predefined permission mapping:
ruby
def method_missing(method_name, *args)
if method_name.to_s =~ /^(upload|delete|download)_(.+)\?$/
action = Regexp.last_match(1).to_sym
attachment = Regexp.last_match(2).to_sym
return attachment_concerns[attachment][action] if attachment_concerns.key?(attachment) &&
attachment_concerns[attachment].key?(action)
end
super
endStep 2: Define attachment_concerns in Your Policy
In each model-specific policy, define the permitted actions for each attachment:
ruby
def attachment_concerns
{
logo: {
upload: update?,
delete: update?,
download: update?
}
}
endWith this setup, calls to upload_logo?, delete_logo?, or download_logo? will be automatically resolved based on the configuration in attachment_concerns, reducing boilerplate and improving maintainability.
Friendly.rb - Your friendly European Ruby Conference