Как указать пользовательское сообщение об исключении из моей способности. 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.rbif состояние:

  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

Ищу 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

Ваша собственная логика может варьироваться в зависимости от того, как вы хотите обрабатывать, когда пользователь не имеет доступа. Возможно, вы даже настроите его для каждого контроллера, но это должно быть суть.

Другие вопросы по тегам