2014-01-20 2 views
0

Я использую Rails 4 в моем проекте с разными ролями в своем приложении, должен предоставлять разные права доступа для разных ролей, для которых я использую gem 'six'. Но не удалось настроить его.Не удалось настроить gem «six» в Rails

В моих user Model определили

ROLES = %w[ ADMIN STUDENT TEACHER ] 

Мой контроллер приложения

before_action :add_abilities 
helper_method :abilities, :can? 

def abilities 
    @abilities ||= Six.new 
end 

private 
def can?(object, action, subject) 
    abilities.allowed?(object, action, subject) 
end 
def add_abilities 
    abilities << Ability 
end 

мой ability.rb

`

class Ability 
    class << self 
    def allowed(user, subject) 
     return [] unless user.kind_of?(User) 

     case subject.class.name 
     when "School" then school_abilities(user, subject) 
     when "Standard" then standard_abilities(user, subject) 
     when "Section" then section_abilities(user, subject) 
     when "Subject" then subject_abailities(user, subject) 
     when "Test" then test_abilities(user, subject) 
     when "Teach" then teach_abitities(user,subject) 
     when "Study" then Study_abilities(user,subject) 
     when "Participate" then participate_abilities(user, subject) 
     else [] 
     end.concat(global_abilities(user)) 
    end 

    def global_abilities(user) 
     rules = [] 
     rules << :create_school 
     rules 
    end 

    def school_abilities(user, school) 
     rules = [] 

     # if User::ROLES.first == "ADMIN" 
     # rules += school_admin_rules 
     # end 
     # if User::ROLES.last == "TEACHER" 
     # rule += school_teacher_rules 
     # end 
     # if User::ROLES.second == "STUDENT" 
     # rule += school_student_rules 
     # end 
     if user.role == "ADMIN" 
     rules += school_admin_rules 
     end 
     if user.role == "TEACHER" 
     rule += school_teacher_rules 
     end 
     if user.role == "STUDENT" 
     rule += school_student_rules 
     end 

     rules.flatten 
    end 

    def school_student_rules 
     [ 
     :read_test 
     ] 
    end 

    def school_teacher_rules 
     [ 
     :read_test, 
     :write_test, 
     :modify_test, 
     :create_test 
     ] 
    end 

    def school_admin_rules 
     [ 
     :admin_school, 
     :change_school, 
     :rename_school, 
     :remove_school, 
     :modify_school, 
     :write_school 
     ] 

    end 

    [:issue, :note, :snippet, :merge_request].each do |name| 
     define_method "#{name}_abilities" do |user, subject| 
     if subject.school == user 
      [ 
      :"read_#{name}", 
      :"write_#{name}", 
      :"modify_#{name}", 
      :"admin_#{name}" 
      ] 
     elsif subject.respond_to?(:teach) && subject.teach == user 
      [ 
      :"read_#{name}", 
      :"write_#{name}", 
      :"modify_#{name}" 
      ] 
     elsif subject.respond_to?(:study) && subject.study == user 
      [ 
      :"read_#{name}", 
      :"write_#{name}" 
      ] 
     else 
      subject.respond_to?(:school) ? school_abilities(user, subject.school) : [] 
     end 
     end 
    end 

    end 
end 

`

Если выбранная роль является учителем, она может получить доступ только к контролерам, а не к другому контроллеру. Как я могу сделать. Кто-то, пожалуйста, помогите мне. Заранее заблаговременно

ответ

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