2016-12-12 76 views
6

, ben şu kural vardır:Yeteneklerimden özel bir istisna mesajı nasıl belirleyebilirim? Benim <code>ability.rb</code> yılında

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

Ama bu benim istediğim mesaj üretmez.

İstediğim iletiyi üretmek için bu kuralı nasıl alırım?

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 koşulu ile ne. IF koşulu ELSIF koşulundan önce bir yerde mevcut mu? Bence sorun budur. –

+1

Denetleyici kodunuzu gönderin. Denetleyicinizdeki istisnayı yakalamanız ve mesajını burada belirtildiği gibi flaş veya uyarı bölümünde kullanmanız gerekir: https://github.com/CanCanCommunity/cancancan/wiki/Exception-Handling. Ability.rb'nin doğru istisna oluşturması sadece işin yarısıdır. – mlabarca

+0

@mlabarca Denetleyicimin içinde özellikle ne arıyorsunuz? Kontrol cihazım beastly, bu yüzden sadece sizin için daralmaya çalışıyorum. – marcamillion

cevap

2

Bu Aradığınız ne:

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 

Bunlar benim ProfilesController bazı parçalarıdır: Burada düzenleme 1

tam ability.rbif durumdur:

https://github.com/CanCanCommunity/cancancan/wiki/Exception-Handling

+0

Yukarıdakileri denememi sağlayan şey buydu. Ama işe yaramıyor. – marcamillion

1

Ana uygulama denetleyicinizde veya özel denetleyicinizde rescue_from CanCan::AccessDenied'u arayın. Bir giriş sayfasına yönlendirmek gibi bir şey yapmalı. Benim durumumda böyle bir şey:

rescue_from CanCan::AccessDenied do || 
    redirect_to new_user_session_path 
end 

flaş kullanmadan, muhtemelen böyle olacağını görüntülemeden sonra farklı bir istisna mesajı üreten ve konum beri:

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

Kendi mantığı Kullanıcının erişimi olmadığında nasıl işlemek istediğinize bağlı olarak değişebilir. Hatta kontrolör bazında kurulum yapmış olabilirsiniz, ancak bunun esası olmalıdır.

2

cancan docs mesajını özelleştirme örneklerini vermek ne zaman denetleyicisi authorize! ve el bir hata yükseltmek, ancak ability.rb iletileri belirtmek için herhangi bir mekanizma olarak görünmüyor zaman.

Bunun yerine, yakalamak ve sizin ApplicationController bunu değiştirebilir:

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