2015-03-05 5 views
0

Я собираю побочный проект для сайта преподавателя/студента, где студент будет делиться панелью с учителем. Учитель и ученик могут загружать файлы и оставлять комментарии на панели инструментов.Настройка пользовательских разрешений в области «приборной панели» в рельсах

Часть, за которую я застрял, является разрешением. Для студента, я создал контроллер индекса к этому методу

def index 
@Homework = Homework.where(:user_id = current_user) 
end 

С этим, я могу иметь студента видеть только ту работу, которую они имеют, но я запутался о том, как получить учитель, чтобы увидеть работу каждого отдельного ученика?

Предложения? Спасибо

+0

Посмотрите CanCan https://github.com/ryanb/cancan –

+0

Есть ли у вас какие-либо отношения между преподавателями и студентами? то есть учителям '' 'have_many''' ученикам и учащимся' '' own_to''' учителям? Есть ли у вас какие-либо отношения к домашнему заданию? Все ли они «пользователи» с разными атрибутами типа? Если вы можете дать нам еще несколько о том, как ваши данные смоделированы, мы можем помочь вам гораздо эффективнее. – aspencer8111

+0

учитель has_many ученики и студент принадлежит учителю. студент и учителя имеют домашнюю работу. – Wilson

ответ

0

Вот простое решение, если вы только когда-либо необходимо поддерживать один класс в приложении:

def index 
    if current_user.teacher? 
    @homeworks = Homework.all 
    else 
    @homeworks = Homework.where(user_id: current_user) 
    end 
end 

В противном случае, ваша Homework схема не кажется, правильно спроектированный. Смотрите ваш запрос ниже:

Homework.where(:user_id = <student_id>) 

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

Homework.where(:class_id = <class_id>, :user_id = <student_id>) 

Класс has_many Учителя и has_many Студенты. Этот дизайн позволит вам поддерживать несколько классов.

еще несколько наводящих вопросов:

  • ли и держали учитель/ученик в одной и той же модели пользователя?
  • Как вы проводите различие между учителем/учеником в текущей модели пользователя?
  • Есть ли столбец «user_type» где-то в User?
  • Что происходит, если current_user имеет «user_type» учителя?

Для сложных пользовательских разрешений используйте CanCanCan: https://github.com/CanCanCommunity/cancancan

0

Не используйте переменные экземпляра верхнего регистра. ex: @Homework должно быть @homework

Проверьте драгоценный камень CanCan. Установите его (следуйте инструкциям, вы должны положить что-то в контроллер приложения), Затем поместите в файл способность:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    can :manage, Homework, user_id: user.id 
    end 
end 

Тогда в верхней части StudentController поместить

load_and_authorize_resource 

, а также индекс должен выглядеть так:

@homework = @student.homework 

Теперь вы не опубликовали весь свой контроллер, так что я могу помочь.

Я считаю, что у вас может быть более серьезная проблема. У вас есть ученики и учителя, где есть моя домашняя работа, которую я читаю в вашем комментарии. Затем в вашем примере вы используете user_id. Вы, скорее всего, переоцениваете своих учеников и учителей в домашнем задании. Вам понадобится отношение has_and_belongs_to_many ИЛИ вам понадобятся колонки student_id и teacher_id в домашней таблице

Cancan автоматически генерирует ряд переменных экземпляра, которые могут заставить его чувствовать себя как волшебство. Наблюдайте за бесплатными railscasts на cancan того же парня, который сделал видео, написав библиотеку CanCan.

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