2013-04-11 2 views
1

Я пытаюсь установить доступ к вложенному ресурсу (специальности) ex. ".../компания /: идентификатор/специальности". Доступ к компании, которая не принадлежит мне, работает нормально. Но я не могу получить доступ к своим специальностям. Пожалуйста, помогите мне, потому что я потратил 4 часа на поиск решения без каких-либо результатов. У меня есть следующие:Ошибка Cancan при авторизации на вложенном ресурсе

канкан 1.6.9

//routes.rb 
    resources :companies do 
    resources :specialties 
    end 

//ability.rb

class Ability 
    include CanCan::Ability 

def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.super_admin? 
    can :open, :admin_pages 
    else 
    cannot :open, :admin_pages 
    end 

    can [:edit, :update, :destroy], Company do |company| 
    company.try(:admin) == user 
    end 

    can :manage, Specialty 
    end 
end 

//companies_controller.rb

class CompaniesController < ApplicationController 
    load_and_authorize_resource 
    def new 
    @company = current_user.build_company 
    end 

    def create 
    @company = current_user.build_company params[:company] 
    if @company.save 
     redirect_to root_path, notice: I18n.t('notices.company_successfully_created') 
    else 
     render :new 
    end 
    end 

    def edit 
    @company = Company.find params[:id] 
    end 

    def update 
    @company = current_user.company 
    if @company.update_attributes(params[:company]) 
     redirect_to root_path, notice: I18n.t('notices.company_successfully_updated') 
    else 
     render action: 'edit' 
    end 
    end 

end 

//specialties_controller.rb

class SpecialtiesController < ApplicationController 
    load_and_authorize_resource :company 
    load_and_authorize_resource through: :company 

    before_filter :company, except: [:destroy] 

    def index 
    @specialties = @company.specialties 
    respond_to do |format| 
     format.json { 
     resource = params[:resource_type]=='user' ? User.new : Profile.new 
     render :json => {:success => true, :html => (render_to_string '_specialties_list.html.slim', :locals => {:resource => resource})} 
     } 
     format.html {} 
    end 
    end 

    def new 
    @specialty = @company.specialties.build 
    end 

    def create 
    @specialty = @company.specialties.build params[:specialty] 
    if @specialty.save 
     redirect_to company_specialties_path, notice: I18n.t('notices.specialty_successfully_created') 
    else 
     render :new 
    end 
    end 

    def show 
    @specialty = Specialty.find params[:id] 
    end 

    def edit 
    @specialty = Specialty.find params[:id] 
    end 

    def update 
    @specialty = Specialty.find params[:id] 
    if @specialty.update_attributes(params[:specialty]) 
     redirect_to company_specialties_path, notice: I18n.t('notices.specialty_successfully_updated') 
    else 
     render action: 'edit' 
    end 
    end 

    def destroy 
    @specialty = Specialty.find(params[:id]) 
    @specialty.destroy 
    redirect_to company_specialties_path 
    end 

    private 

    def company 
     @company = Company.find(params[:company_id]) 
    end 

end 
+0

Любое конкретное действие вызывает ошибку? Какова трассировка стека. Используйте pastebin для вставки трассировки стека и ответа с помощью url, если вы намереваетесь сделать это. – manoj

+0

Например (компания с id = 3 является моей) http: // localhost: 3000/компании/3/specialties не дает доступа, пока я могу получить доступ к http: // localhost: 3000/companies/3/edit и I (и это, как я ожидаю) http: // localhost: 3000/companies/2/edit, поэтому я не могу получить доступ к чему-либо, вложенному в ресурс компании –

+0

Получаю «У вас нет доступа к этой странице». –

ответ

0

В вашем файле возможностей вы предоставили только [: edit,: update,: destroy] доступ для администратора компании к той же компании.

Когда он пытается получить доступ к любому действию в контроллере специальностей, первая load_and_authorize_call: компания попытается ПРОЧИТАТЬ компанию. После прочтения компании он найдет специальность через компанию и проверит, имеет ли пользователь права на конкретные действия по специальности.

В этом случае пользователь имеет все разрешения на специальности, но не имеет права на чтение для компании, поэтому проблема

Так что добавьте: разрешения на чтение или предоставить все разрешения с помощью: управлять администратору компании.

can [:read, :edit, :update, :destroy], Company do |company| 
    company.try(:admin) == user 
end 
Смежные вопросы