2016-08-12 2 views
0

У меня есть контакты контроллера, который загружает и авторизует ресурс с помощью cancancan:Override метод канкан, который повышает исключение «неинициализированный постоянный контакт»

class ContactsController < ApplicationController 
    before_filter :authenticate_user! 
    load_and_authorize_resource 
end 

Мой индекс действия никогда не вызывается, поскольку Contact ресурс может быть доступен только в пространстве имен, называемом MongoidContainer. Следовательно, единственным способом доступа к Контакты в моей системе является MongoidContainer :: Contact. Следовательно, когда cancancan пытается загрузить ресурс, исключение возникает здесь:

module CanCan 
    class ControllerResource 
    ... 
    def resource_class 
     case @options[:class] 
     when false then name.to_sym 
     when nil then namespaced_name.to_s.camelize.constantize 
     when String then @options[:class].constantize 
     else @options[:class] 
     end 
    end 
    ... 
    end 
end 

Я попытался переопределить этот метод в ContactsController но переопределение никогда не вызывается. Модуль, скорее всего, не включен в пространство имен ApplicationController. Как я могу переопределить этот метод?

Я видел вариант, который сказал, что вы можете передать параметр класса, как это, который работает:

load_and_authorize_resource class: 'MongoidContainer::Contact' 

Я просто очень любопытно, почему метод не был переопределен в этой ситуации.

ответ

0

ControllerResource, скорее всего, не находится в иерархии вашего контроллера, поэтому определение этого метода в контроллере ничего не делает.

Об этом говорится в коде для файла этого класса. См https://github.com/ryanb/cancan/blob/4560928dc375f9b31de00381c98334eb6aabc4b9/lib/cancan/controller_resource.rb#L2

Handle логику нагрузки и авторизации контроллера, поэтому мы не загромождать все контроллеры с методами без интерфейса.

Я не уверен, но CanCan, кажется, добавляет before_filter, который затем делегирует ControllerResource.

# https://github.com/ryanb/cancan/blob/4560928dc375f9b31de00381c98334eb6aabc4b9/lib/cancan/controller_additions.rb#L14-L15 
def load_and_authorize_resource(*args) 
    cancan_resource_class.add_before_filter(self, :load_and_authorize_resource, *args) 

# https://github.com/ryanb/cancan/blob/4560928dc375f9b31de00381c98334eb6aabc4b9/lib/cancan/controller_resource.rb#L9-L10 
controller_class.send(before_filter_method, options.slice(:only, :except, :if, :unless)) do |controller| 
    controller.class.cancan_resource_class.new(controller, resource_name, options.except(:only, :except, :if, :unless)).send(method) 
Смежные вопросы