在Rails 7.1中集成actionpolicy时自定义异常消息的方法
解决ActionPolicy自定义异常消息的问题
要在ActionPolicy中添加自定义异常提示,需在Policy规则方法中手动添加错误原因,再在异常捕获逻辑中读取并展示给用户。
步骤1:修改Policy类,添加错误原因
更新InvestigationReviewPolicy的new?方法,在验证不通过时调用reasons.add写入自定义消息:
class InvestigationReviewPolicy < ApplicationPolicy def new? record.state == "completed" || reasons.add(:invalid_state, "调查处于错误状态") end end
如果偏好分支写法,也可以这样写:
class InvestigationReviewPolicy < ApplicationPolicy def new? if record.state == "completed" true else reasons.add(:invalid_state, "调查处于错误状态") false end end end
步骤2:在控制器中捕获并展示消息
修改ApplicationController的异常捕获逻辑,读取自定义消息并通过flash提示用户:
class ApplicationController < ActionController::Base rescue_from ActionPolicy::Unauthorized do |ex| # 获取自定义消息,无消息时用兜底文本 error_msg = ex.result.reasons.full_messages.first || "您无权执行此操作" flash[:alert] = error_msg redirect_back(fallback_location: root_path) end ... end
原理说明
默认情况下,ActionPolicy的规则方法仅返回布尔值,不会附带任何错误详情,这也是你之前日志中details和full_messages为空的原因。通过reasons.add可以将自定义错误信息绑定到验证结果中,触发异常时就能读取到这些内容。
内容的提问来源于stack exchange,提问作者Sig
相关产品推荐
相关产品推荐

