2016-12-12 69 views
6

在我ability.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 
+0

什麼是與ELSIF條件。 IF條件是否在ELSIF條件之前存在?我認爲這是問題所在。 –

+1

發佈您的控制器代碼。您必須捕獲控制器中的異常,並在響應的閃存或警報部分使用其消息,如以下所述:https://github.com/CanCanCommunity/cancancan/wiki/Exception-Handling。有ability.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 
相關問題