I have the following action for my proposals controller:
def show
@proposal = Proposal.find(params[:id])
authorize @proposal
end
I have the following policy:
class ProposalPolicy
attr_reader :current_user, :proposal
How can I redirect to a specific page. Say index proposals or root page if the permission is denied when trying to go to the show page?
When I navigate to it without the right permission I just get a rails error page with the following:
not allowed to show? this<proposal OBJ ispsum lorem>
I just want them to have a simple notification and redirected to another page. What is best way to do this? I am guessing with some sort of if statement in the show view but nothing has worked so far.
def initialize(current_user, proposal)
@current_user = current_user
@proposal = proposal
end
def show?
@proposal.published? or @proposal.proposer == @current_user
end
end
Pundit has a mechanism for this. You'll create a private method in your controller called user_not_authorized
- in it you'll be able to create a flash notification and add a location.
class ApplicationController < ActionController::Base
protect_from_forgery
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
private
def user_not_authorized
flash[:alert] = "You are not authorized to perform this action."
redirect_to(request.referrer || root_path)
end
end
More information here: https://github.com/elabs/pundit#rescuing-a-denied-authorization-in-rails
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With