2010-09-28 4 views
1

J'utilise actuellement l'autorisation déclarative sur mon application, et je tente d'intercepter les exceptions du type Authorization :: NotAuthorized.Autorisation déclarative - Catch "Authorization :: NotAuthorized" Exception

J'ai une entité qui a une catégorie. Selon le rôle, un utilisateur peut créer une nouvelle catégorie lors de la création de cette entité. Lors de mon rappel: before_validation, j'attribue la catégorie et je veux pouvoir attraper l'exception d'autorisation au cas où il n'aurait pas la permission.

Je pourrais vérifier son rôle et faire une instruction conditionnelle, mais ensuite je devrais écrire tous les rôles.

Une exception est levée, mais je ne suis pas en mesure de l'attraper, à la "nouvelle" instruction.

Code suit:

# Model 
before_validation :set_category 

def category_name 
    @category_name ||= category.name unless category.nil? 
    @category_name 
end 

def category_name=(name) 
    name.strip! 
    name.downcase! 
    @category_name = name 
end 

def set_category 
    if @category_name and not company.blank? 
     lookup_category = company.categories.not_deleted.find_by_name(@category_name) 
     begin 
      category = lookup_category.blank? ? company.categories.new(:name => @category_name) : lookup_category 
     rescue Authorization::NotAuthorized 
      errors.add(:category, I18n.t('activerecord.errors.messages.exclusion')) 
     end 
    end 
end 

# Controller 
def create 
    @ticket = current_user.created_tickets.new(params[:ticket]) 
    if @ticket.save # Line 88 
    ... 

Exception trace de la pile:

Authorization::NotAuthorized (No matching rules found for create for #<User id: 36,..."> (roles [:Requester], privileges [:create], context :categories).): 
    /Library/Ruby/Gems/1.8/gems/declarative_authorization-0.4.1/lib/declarative_authorization/authorization.rb:168:in `permit!' 
    /Library/Ruby/Gems/1.8/gems/declarative_authorization-0.4.1/lib/declarative_authorization/in_model.rb:131:in `using_access_control' 
    /Library/Ruby/Gems/1.8/gems/after_commit-1.0.7/lib/after_commit/connection_adapters.rb:12:in `transaction' 
    /Library/Ruby/Gems/1.8/gems/after_commit-1.0.7/lib/after_commit/connection_adapters.rb:12:in `transaction' 
    app/controllers/tickets_controller.rb:88:in `create' 

Debugger va à l'intérieur du bloc:

# Debugger 
lookup_category = company.categories.not_deleted.find_by_name(@category_name) 
(rdb:3) list 
[275, 284] in /Users/Pedro/projects/trunk/app/models/ticket.rb 
    275  
    276 def set_category 
    277  if @category_name and not self.company.blank? 
    278  begin 
    279   debugger 
=> 280   lookup_category = company.categories.not_deleted.find_by_name(@category_name) 
    281   self.category = lookup_category.blank? ? company.categories.new(:name => @category_name) : lookup_category 
    282  rescue Authorization::NotAuthorized 
    283   self.errors.add(:category, I18n.t('activerecord.errors.messages.exclusion')) 
    284  end 
(rdb:3) n 
/Users/Pedro/projects/trunk/app/models/ticket.rb:281 
self.category = lookup_category.blank? ? company.categories.new(:name => @category_name) : lookup_category 
(rdb:3) list 
[276, 285] in /Users/Pedro/projects/trunk/app/models/ticket.rb 
    276 def set_category 
    277  if @category_name and not self.company.blank? 
    278  begin 
    279   debugger 
    280   lookup_category = company.categories.not_deleted.find_by_name(@category_name) 
=> 281   self.category = lookup_category.blank? ? company.categories.new(:name => @category_name) : lookup_category 
    282  rescue Authorization::NotAuthorized 
    283   self.errors.add(:category, I18n.t('activerecord.errors.messages.exclusion')) 
    284  end 
    285  end 
(rdb:3) n 
/Users/Pedro/.gem/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb:94 
break result if terminator.call(result, object) 
(rdb:3) list 
[89, 98] in /Users/Pedro/.gem/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/callbacks.rb 
    89   unless block_given? 
    90   send(enumerator) { |callback| callback.call(object) } 
    91   else 
    92   send(enumerator) do |callback| 
    93    result = callback.call(object) 
=> 94    break result if terminator.call(result, object) 
    95   end 
    96   end 
    97  end 
    98 
(rdb:3) 
+0

quelle ligne de votre commande est ligne 88? – shingara

+0

Pouvons-nous voir votre contrôleur aussi? – shingara

+0

Code ajouté du contrôleur –

Répondre

0

je dirais qu'il est briser en dehors du bloc begin ... rescue et donc pas pris par le sauvetage. Essayez de faire le même sauvetage sur la ligne 88 de votre contrôleur. Si vous voulez gérer cela dans le processus de validation, essayez peut-être de tester les rôles ou les permissions de l'utilisateur avant de créer votre objet au lieu d'attraper l'exception qui ne sera lancée qu'à la création.

+0

L'exception est levée à l'intérieur du bloc de secours. J'ai lancé le débogueur –

+0

@yise: es-tu sûr? – marcgg

+0

@marcgg: Ajout d'un journal de débogueur –

0

Il n'est pas possible d'intercepter l'exception sur un rappel avant. La meilleure manière que je trouvais à faire ce genre de validation est:

# Model code 
begin 
    User.with_permissions_to :create, :categories # Raises exception if not permitted 
    ... do whatever you want 
rescue 
    ... do whatever you want 
end 

Merci pour toute l'aide

Questions connexes