我试图在权威政策中集中认证,而不是在我的控制器中。它运行良好但我在定制重定向和flash消息时失去了一些灵活性。
如何将有关哪些身份验证的信息传递给Pundit :: NotAuthorizedError救援功能?一个动作可以有2个身份验证步骤:1。user.paid? 2. user.is_allowed_to_update?我希望每个案例都有自定义消息和重定向。
exception.query
解决方案无效,因为它只允许为每个操作自定义Flash和重定向,而不是在一个操作中。
以下是对情况的更详细解释
WITHOUT PUNDIT
Comment_Controller
def update
if user.didnt_pay?
flash[:message] = nice_message
redirect_to payment_page_path
elsif user.is_not_allowed_to_perform_action
flash[:message] = less_nice_message
redirect_to dashboard_path
end
end
现在
WITH PUNDIT
Comment_Controller
def update
authorize @comment
end
Comment_policy
def update?
user.paid? && user_is_allowed_to_perform_action
end
ApplicationController
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
def user_not_authorized
flash[:message] = one_message_for_all_error # THIS IS WHAT I WANT TO CUSTOMIZE
redirect_to one_path_for_all_error # THIS IS WHAT I WANT TO CUSTOMIZE
end
答案 0 :(得分:1)
自定义此错误的可能性会将其设置为Policy
中的预期消息,然后从控制器获取该消息。怎么做?
您在控制器中作为参数获得的exception
对象
class CommentsController < ApplicationController
def user_not_authorized(exception)
end
end
附带policy
属性,可将您链接到违规政策。因此,假设在您的策略中,您希望在未满足某个子句时设置特定消息:
class AnimalPolicy < ApplicationPolicy
attr_accessor :error_message
def new?
if !authorization_clause
@error_message = "Something terrible happened"
false
else
true
end
end
end
因此,在您的控制器中,您必须将此error_message
设置为flash
或您希望的位置:
class CommentsController < ApplicationController
def user_not_authorized(exception)
flash[:error] = exception.policy.try(:error_message) || "Default error message"
redirect_to root_path
end
end
这是一个有点笨拙的解决方案,但它对我有用
答案 1 :(得分:0)
在我的解决方案中,我提出了两种方法,一种是当用户得到一个很好的答案时另一种方法,当答案不利时...权威有一个方法(user_not_authorized),它允许管理一个可以复制并适应你的建议
def update
if user.didnt_pay?
authorize @comment
user_congratulation
elsif user.is_not_allowed_to_perform_action
user_not_authorized
end
end
ApplicationController 中的
通过此 rescue_from Pundit :: NotAuthorizedError,使用:: user_not_authorized
之后,您将在控制器中创建两个名为
的私有方法user_not_authorized和user_congratulation
private
def user_not_authorized
flash[:alert] = "less_nice_message"
redirect_to dashboard_path
end
def user_congratulation
flash[:alert] = "nice_message"
redirect_to payment_page_path
end
end
有关详细信息,请访问此链接https://github.com/elabs/pundit#rescuing-a-denied-authorization-in-rails
虽然这篇文章很老,但我觉得很合适,因为我也需要一个好的答案,但事实并非如此!我希望能帮助