2014-01-24 3 views
1

У меня есть модель пользователя, которая дифференцируется на 6 ролей, и я определяю разные переменные и направляю их в разные файлы просмотра (аналогичный формат, но разные таблицы информации), но в рамках одного и того же действия контроллера, потому что все они имеют похожие страницы «обзор», «профиль», «сообщения» и т. д.Маршрутизация для нескольких пользовательских ролей

Теперь контроллер действительно грязный и имеет несколько операторов if/else. Я считаю, что я должен менять маршруты, чтобы каждый пользователь имел свой собственный контроллер, исключая использование монтирования if/else, которая в настоящее время вторгается в контроллер.

def index 
    if current_user.admin? 
    .... 
    end 
    if current_user.moderator? 
    .... 
    end 
end 

Вопрос: Как выполнить маршрутизацию такой, что URL будет www.website.com/1/schedule, где 1 = current_user.id, в то время как имеющие различные просматривать файлы, формируемые по различным контроллерам?

Я собираюсь сделать AdminController и ModeratorController, чтобы справиться с этим, но я не уверен, как выполнить маршрутизацию, или, действительно, это лучший способ сделать это. Спасибо за совет заранее!

+1

Возможный дубликат: http: //stackoverflow.com/questions/11053175/devise-role-based-routing Надеюсь, это поможет вам. – Pavan

ответ

0

Я думаю, что вы делаете это неправильно. Если у вас похожие страницы для разной роли, я думаю, что вы обращаетесь к той же модели для обработки разных ролей.

Если это так, то вы должны использовать Gem, как Cancan (библиотека авторизации для Ruby on Rails).

+0

Я не разрешаю действия. Я собираюсь на разные страницы вообще. Администраторы будут отображать «admin_overview.html.slim» –

0

Чтобы решить вашу вторую проблему, я не думаю, что это был бы лучший подход. Попробуйте это - отбросьте свою логику от нескольких контроллеров и сохраните логику в ApplicationController. Я не думаю, что вы должны отделить разные роли от контроллеров. Вместо этого посмотрите на свою модель пользователя и введите метод, который проверяет уровень привилегий для разных пользователей. Вы можете создавать методы в своей модели пользователя, которые вы могли бы вызвать в своих контроллерах, чтобы узнать, разрешен ли пользователю доступ к действию. before_action рекомендуется здесь.

Если вы решили сохранить несколько контроллеров, я рекомендую использовать камень, такой как «Власть». Делает гораздо проще отслеживать различные привилегии даже на разных контроллерах - я думаю, что маршрутизация также адресуется: https://github.com/nathanl/authority

+0

В настоящее время у меня есть эти методы запросов в контроллере приложений, и именно поэтому я тестирую роли пользователей в методах индекса соответственно. Я просто задаюсь вопросом, был ли у операторов if-else хороший способ растворения в лучшую структуру. –

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