2016-12-12 11 views
6

В моей ability.rb, у меня есть следующие правила:Как указать собственное сообщение об исключении из моей способности.rb?

elsif user.has_role? :demo 
    can :read, Profile, demo_featured: true, demo_linked: true, message: "To access this profile, please subscribe here." 

Но это не дает послание, которое я хочу.

Как получить это конкретное правило для создания сообщения, которое я хочу?

Edit 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 
+0

Что с условием ELSIF. Состояние IF присутствует где-то до состояния ELSIF? Я думаю, что это проблема. –

+1

Отправьте свой код контроллера. Вы должны поймать исключение в своем контроллере и использовать его сообщение во флэш-или предупреждающей части ответа, как указано здесь: https://github.com/CanCanCommunity/cancancan/wiki/Exception-Handling. Наличие способности.rb создает правильное исключение - это всего лишь половина задания. – mlabarca

+0

@mlabarca Что конкретно в моем контроллере вы ищете? Мой контроллер зверски, поэтому просто пытаюсь сузить его для вас. – marcamillion

ответ

1

Ищите rescue_from CanCan::AccessDenied в своем основном контроллере приложения или в вашем конкретном контроллере. Он должен сделать что-то вроде перенаправления на страницу входа. В моем случае это что-то вроде этого:

rescue_from CanCan::AccessDenied do || 
    redirect_to new_user_session_path 
end 

Поскольку вы производите другое сообщение об исключении, а затем отображать его, было бы, вероятно, как это, при использовании вспышки:

rescue_from CanCan::AccessDenied do |exception| 
    flash[:notice] = exception.message 
    redirect_to new_user_session_path 
end 

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

2

cancan docs привести примеры настройки сообщение, когда вы 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