2016-11-25 5 views
0

Я планирую приложение с моделью пользователя + разные подтипы пользователей (например, студенты, преподаватели, ...) с выделенной моделью для каждого. Я планирую пройти аутентификацию на уровне Пользователей непосредственно в рельсах, без какого-либо конкретного драгоценного камня.Показать просмотр для разных типов пользователей

Моя проблема заключается в обращении с Пользователями Показать файл представления:

  • Я должен показать пользователям непосредственно в шоу файл контроллера пользователя (добавление много условий в моем файле вида, в зависимости от подтип пользователя) или
  • Должен ли я использовать действие контроллера шоу пользователя как шлюз , перенаправляющий контроллер, выделенный для каждого подтипа, ... затем с более простым представлением вида .

ответ

1

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

def show 
    render proper_view_by_user 
end 

private 
def proper_view_by_user 
    # Define this user_type on your own 
    # on devise you'd do something like current_user.class_name 
    switch user_type 
    when 'Admin' then 
     'admins_show' # template found in your views folder 
    when 'NormalUser' then 
     'normal_show' 
    else 
     'normal_show' 
    end 

end 

UNLESS это проектное обучение, на самом деле рассмотреть вопрос об использовании разработки и не прокатит свою собственную систему аутентификации. Прочитано this.

+0

Спасибо, это действительно не слишком сильно перегружает файл просмотра. Ваш код, похоже, перенаправляет меня на выделенный режим отображения подтипа, если я не ошибаюсь. Я все еще немного запутался во всех вещах: это только переключение на авторизацию, или же он охватывает всю структуру сайта и работу. Я прочитаю статью, которую вы упомянули, и попытается немного узнать об этом. – Maxence

+0

Я имел в виду часть auth. В основном, потому что она чувствительна и сложна для покрытия всех фронтов. У разработчика есть много особенностей и имеет разумную безопасность, насколько я знаю, и у нее также есть тонна документации и ответов на SO, которые помогут вам. Can can gem также имеет еще несколько функций, которые помогут вам разрешить части приложения для разных пользователей, но вы можете легко их закодировать. Дайте ему подумать! – mlabarca

+0

Я не знаком с концепцией авторизации, но она придет. Поскольку я думал, что могу сделать это внутри своих контроллеров, просто прекрасно и различаю в зависимости от пользователя, который занимается аутированием ... Один последний вопрос: как вы думаете, я должен держать модель пользователя + подмодели? Или я должен просто избавиться от модели Users и добавить данные аутентификации (письма, пароль ..) в Submodels (которые затем больше не являются подмоделиями, а более разными типами пользователей ..) – Maxence

1

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

<%# users/show.html.erb %> 
<%= render partial: user.user_subtype %> 

<%# users/_admin.html.erb %> 
<h1>Admin</h1> 

<%# users/_student.html.erb %> 
<h1>Student</h1> 

<%# users/_teacher.html.erb %> 
<h1>Teacher</h1> 

Как и в сторону, если вы имеете дело с уровнями доступа Я настоятельно рекомендую использовать жемчужину Pundit. Это избавит вас от многих головных болей.

+0

Спасибо. Я предполагаю, что частицы делают более чистый файл вида. Еще один ответ предполагает, что я не должен добавлять слишком много логики в файл представления. Я все еще немного смущен, но мне нужно немного почитать о Devise. Я думаю, – Maxence

+0

Вероятно, вы вряд ли найдете об этом в документации Devise, так как Devise в основном занимается аутентификацией. То, что вы делаете, - это * авторизация *, которая связана с тем, что пользователь может делать после того, как они вошли в систему. Как я уже упоминал, проверьте жемчужину Pundit - это очень полезно при удалении логики авторизации из представлений. – mysmallidea

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