6

dışındaki ad alanında, bazı genel form işlevleri için kendi motorumu oluşturduğum Rails uygulamasında izinler için CanCan kullanıyorum. Sistemimdeki izinleri kilitlemek istiyorum, böylece kullanıcılar motor kontrol cihazlarının eylemlerine serbestçe erişemezler. Bu kontrolörler, çoğunlukla, 7 REST eylemlerinden faydalanıyorlar, bu yüzden her bir kontrol ünitesinin üst kısmında CanCan'ın load_and_authorize_resource'u kullanmak istiyorum. Bu gibi kodumu yazarkenCanCan: load_and_authorize_resource MainApp

Ancak:

module MyEngine 
     class FormController < ApplicationController 
     load_and_authorize_resource 
     ... 
     end 
    end 

bu hatayı alıyorum:

Benim tahminim load_and_authorize_resource otomatik yükleyici, benim MainApp ad bağlıdır ki
uninitialized constant Form 

ve farklı bir ad alanında çağıracağımı farketmez ve MyEngine::Form.find(params[:id]) yerine Form.find(params[:id]) gibi bir çağrı yapar.

Bu durumda, bunu nasıl düzeltebilirim? Bu büyük bir anlaşma değil çünkü authorize! hala düzgün çalışıyor, bu yüzden her eylemde yetkilendirmeyi ayrı ayrı tanımlayabilirim, ancak load_and_authorize_resource yöntemini kullanabildiysem çok daha temiz hissederdim.

+0

[CanCan kullanarak Adlandırılmış ve İç içe geçmiş Denetleyicileri Yetkilendirmek] olası bir kopyası (http://stackoverflow.com/questions/12334367/authorizing-namespaced-and-nested-controllers-using-cancan) –

cevap

6

O CanCan::ControllerResource#namespace bir hata gibi görünüyor: Gördüğünüz gibi

def namespace 
    @params[:controller].split("::")[0..-2] 
end 

, bu :: tarafından kontrolör yolunu bölmek çalışır ancak my_engine/my_controller şeklinde gelir.

Yani düzeltme dilsiz basittir:

def namespace 
    @params[:controller].split("/")[0..-2] 
end 

Wonder bu kadar uzun süredir böyle bir aptal hata kaçırma nasıl. Onlara bir çekme talebi gönder.

P.S. 8)

+1

Oh! Daha da ilginç: onlar sadece 'master' dalını düzeltmeyi birleştirmeyi unutuyor gibi görünüyor. https://github.com/ryanb/cancan/issues/663 –

+0

Güzel olanı, ihtiyacım olan şey buydu! –

+1

Bunun için bir yama [1.6.10'da] uygulandı (https://github.com/ryanb/cancan/pull/675) –

8

CanCan adlandırılmış modelleri bulamıyor. sınıfını belirtmek için deneyin: Model sınıfı denetleyicisi farklı isim alanlı olup

load_and_authorize_resource class: MyEngine::Form 
3

varsa, :class seçeneği belirtmeniz gerekir.

module MyEngine 
    class FormController < ApplicationController 
    load_and_authorize_resource :class => MyEngine::Form 
    ... 
    end 
end 
+0

Bunun için başlatılmamış sabit MyEngine :: Form 'alıyorum. – hlcs