Как указать пользовательское сообщение об исключении из моей способности. Rb?
В моем 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
3 ответа
В документации cancan приводятся примеры настройки сообщения, когда вы authorize!
в контроллере, и когда вы вручную выдаваете ошибку, но, кажется, нет никакого механизма для указания сообщений в ability.rb
,
Вместо этого вы можете поймать и изменить его в своем ApplicationController
:
class ApplicationController < ActionController::Base
rescue_from CanCan::AccessDenied do |exception|
if current_user.has_role? :demo
redirect_to :back, :alert => "To access this profile, please subscribe here."
end
# render 403, etc.
end
end
Это то, что вы ищете:
https://github.com/CanCanCommunity/cancancan/wiki/Exception-Handling
Ищу 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
Ваша собственная логика может варьироваться в зависимости от того, как вы хотите обрабатывать, когда пользователь не имеет доступа. Возможно, вы даже настроите его для каждого контроллера, но это должно быть суть.