2013-05-03 4 views
0

В настоящее время я пытаюсь интегрировать inherited_resources и полномочия в мое приложение Rails.Интеграция inherited_resources и полномочий

Я немного застрял относительно наилучшего места, чтобы проверить возможность действия контроллера на основе ресурса. Этот код приведен в качестве примера в авторитете:

def edit 
    @llama = Llama.find(params[:id]) 
    authorize_action_for(@llama)  # Check to see if you're allowed to edit this llama. failure == SecurityViolation 
    end 

    def update 
    @llama = Llama.find(params[:id]) 
    authorize_action_for(@llama)  # Check to see if you're allowed to edit this llama. 
    @llama.attributes = params[:llama] # Don't save the attributes before authorizing 
    authorize_action_for(@llama)  # Check again, to see if the changes are allowed. 
    if @llama.save? 
    # etc 
    end 

Поскольку в inherited_resources искатели абстрагируются прочь, я подумал, что было бы неплохо также лавировать в authorise_action_for проверки на этих отвлеченных искатели.

Двойная проверка органа власти в случае обновления (и, предположительно, создания).

ответ

1

Я полагаюсь на ActiveSupport::Concern, чтобы упростить модуль. Я сохраняю свои проблемы в каталоге под названием concerns под номером app. Я назвал этот inherited_resources_with_authority.rb, и вам может потребоваться изменить autoload_paths в application.rb, чтобы загрузить файлы из этой папки.

module InheritedResourcesWithAuthority 

    extend ActiveSupport::Concern 

    included do 
     inherit_resources 
     authorize_actions_for :resource_class 

     alias_method_chain :resource, :authority 
     alias_method_chain :build_resource, :authority 
     alias_method_chain :update_resource, :authority 
    end 

    protected 

    def resource_with_authority 
     resource_without_authority 
     authorize_action_for(get_resource_ivar) 
    end 

    def build_resource_with_authority 
     build_resource_without_authority 
     authorize_action_for(get_resource_ivar) 
    end 

    def update_resource_with_authority(object, attributes) 
     object.assign_attributes(*attributes) 
     authorize_action_for(object) 
     object.save 
    end 

end 

Мы в основном цепочки важные inherited_resources "абстрактные методы и вставив свой код авторизации, где это необходимо. Последний из них самый сложный, поскольку мы не можем назвать оригинальный метод, к которому мы привязаны, поэтому нам нужно дублировать код inherited_resources.

Чтобы использовать эту проблему, просто позвоните include InheritedResourcesWithAuthority с вашего контроллера.

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

Полная рецензия здесь: https://coderwall.com/p/tp5sig

Предложение, безусловно, приветствует: D

+0

Пожалуйста, обратите внимание, что вы должны размещать основные части ответа здесь, на этом сайте, или ваши почтовые риски удаления [См FAQ где он упоминает ответы, которые «чуть больше, чем ссылка».] (http://stackoverflow.com/faq#deletion). Вы можете по-прежнему включать ссылку, если хотите, но только как ссылку. Ответ должен стоять сам по себе, не нуждаясь в ссылке. – Taryn

Смежные вопросы