在我的ability.rb
中,我有以下规则:
elsif user.has_role? :demo
can :read, Profile, demo_featured: true, demo_linked: true, message: "To access this profile, please subscribe here."
但这不会产生我想要的信息。
如何获得此特定规则以生成我想要的消息?
修改1
以下是完整的ability.rb
if
条件:
def initialize(user)
user ||= User.new # guest user (not logged in)
alias_action :create, :show, :new, :destroy, to: :csnd
if user.has_role? :admin
can :manage, :all
elsif user.has_role? :coach
# do some stuff
elsif user.has_role? :demo
can :read, Profile, demo_featured: true, demo_linked: true
elsif user.has_role? :player
# can do some stuff
else
can :read, Profile
end
end
这些是我的ProfilesController
:
before_action :set_profile, only: [:show, :edit, :update, :destroy, :invite_user, :profiles]
def set_profile
@profile = Profile.published.includes(:grades, :positions, :achievements, :videos, :transcripts).friendly.find(params[:id])
end
答案 0 :(得分:2)
答案 1 :(得分:2)
cancan docs给出了在控制器中authorize!
时自定义消息的示例,以及手动引发错误时的示例,但似乎没有任何机制可以在{{{ 1}}。
相反,您可以在ability.rb
:
ApplicationController
答案 2 :(得分:1)
在主应用程序控制器或特定控制器中查找rescue_from CanCan::AccessDenied
。它应该像重定向到登录页面。就我而言,它是这样的:
rescue_from CanCan::AccessDenied do ||
redirect_to new_user_session_path
end
由于你正在制作一个不同的异常消息然后显示它,它可能是这样的,使用flash:
rescue_from CanCan::AccessDenied do |exception|
flash[:notice] = exception.message
redirect_to new_user_session_path
end
根据您在用户无权访问时的处理方式,您自己的逻辑可能会有所不同。您可能甚至可以在每个控制器的基础上进行设置,但这应该是它的主旨。