2016-03-14 5 views
0

У меня нет идеи о том, как реализовать отображение профиля нескольких пользователей. Я использую наследование STI для нескольких типов людей.Маршрутизация для нескольких просмотров профиля

Что я хочу?

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

Я думал о представлении профиля (backend_people_profile) только для модели людей и update_profile для каждого типа. Правильно ли это? Теперь у меня слишком много повторяющихся путей.

routes.rb

namespace :backend do 
     resources :managers, except: [:new, :create] do 
     get '/profile', to: 'people#show_profile' 
     end 

     resources :clients, except: [:new, :create] do 
     get '/profile', to: 'people#show_profile' 
     end 

     resources :receptionists, except: [:new, :create] do 
     get '/profile', to: 'people#show_profile' 
    end 

     resources :trainers, except: [:new, :create] do 
     get '/profile', to: 'people#show_profile' 
     end 

     resources :lifeguards, except: [:new, :create] do 
     get '/profile', to: 'people#show_profile' 
     end 
    end 
+0

Позвольте мне понять, что у вас есть класс Person с подклассами и вы хотите иметь более чистый способ? У вас также есть анкета в профиле? Вы можете использовать 'form_for (resource, as: 'person', url: profile_url)', чтобы избежать некоторого дублирования. –

+0

Также подумайте о том, чтобы добавить контроллер профилей, чтобы он приближался к REST. –

ответ

1
namespace :backend do 
    resources :people 

    [:clients, :receptionists, :trainers, :lifeguards].each |type| do 
    get type, to: "people#index" 
    end 
end 

Я хотел бы начать с простейшей установки. В этом случае у вас будут только полные маршруты CRUD для базового типа people. Это позволяет избежать загромождения вашего API с тонны маршрутов, которые выполняют ту же самую вещь.

Для каждого подтипа вы просто действие, индекс, который отчасти напоминает:

GET /people?type=trainer 

Вы можете хотеть рассмотреть, если вы действительно нужны отдельные маршруты для профилей - если вы не нуждаетесь в двух существенно различных представлений можно получить с помощью с обычными CRUD маршрутов:

GET|POST   /people 
GET|DELETE|PATCH /people/:id 
GET    /people/:id/new 
GET    /people/:id/edit 

другой случай был бы приложение, где пользователи CRUD: Под ред админов, где вам нужен отдельный интерфейс для регулярного пользователя регистрации. В этом случае вы можете сделать это следующим образом:

namespace :backend do 
    resources :people 
    [:clients, :receptionists, :trainers, :lifeguards].each |type| do 
    get type, to: "people#index" 
    end 
end 

# public facing route 
resources :registrations, only: [:new, :create, :show, :edit, :update] 
+2

Хотя на стороне примечание, использующее STI в этом случае, вероятно, ошибочно - вы строите ограничение, которое пользователь может принадлежать только определенной категории - не ожидайте, что реальность будет соответствовать вашей модели! Вместо этого вы бы использовали много отношений между пользователями и ролями. Это проверенный и верный способ решения одной и той же проблемы. – max