Rails Routing с ролями пользователей Enum
Я создал таблицу пользователей и внедрил Devise. Затем я добавил роль enum в таблицу пользователей, чтобы можно было идентифицировать администраторов, гидов и участников.
Я хотел бы ограничить маршруты для определенных ресурсов в зависимости от типа пользователя enum. Я пробовал:
resources :users.guide do
get 'guide/dashboard', :to => 'guides#dashboard'
end
и некоторые варианты, но безуспешно. Вышесказанное дает мне ошибку:
undefined method `guide' for :users:Symbol
Я немного покопался и, похоже, не нашел хорошего ответа. Я избегаю CanCanCan и Rolify, так как хочу, чтобы все было как можно более простым. Есть идеи? Спасибо!
Отредактировано под предложением ниже
Поэтому я пошел и обновил свои маршруты, как предложено ниже, чтобы файл выглядел примерно так:
Rails.application.routes.draw do
devise_for :users
#open to public
root 'welcome#index'
resources :guides, only: [:show], param: :username
resources :itineraries, only: [:index] #, only: [:index, :show]
authenticate :user, ->(u) { u.guide? } do
resources :guides, only: [:edit, :destroy], param: :username
get 'guide/dashboard', :to => 'guides#dashboard'
end
resources :locations, only: [:new, :create, :edit, :update, :destroy, :index, :show]
end
По любой причине, руководство профиля показывает / редактирует, работает отлично; приборная панель работает нормально; но другие вещи за пределами блока проверки подлинности (ресурсы маршрутов и местоположений) не работают, я перенаправлен на страницу входа в Devise. Они находятся вне (и в одном случае выше) блока проверки подлинности, не зная, почему это происходит с некоторыми ресурсами / маршрутами, а не с другими.
2 ответа
Вы можете использовать придумывать помощников. С authenticate
Можно создать ресурсы и маршруты, которые будут запрашивать аутентификацию, прежде чем они будут доступны. Замена authenticate
с authenticated
делает ресурс просто недоступным, если пользователь не аутентифицирован. Оба помощника принимают необязательную область видимости и блок, чтобы обеспечить ограничения для самого экземпляра модели.
authenticate :user, ->(u) { u.guide? } do
get 'guide/dashboard', :to => 'guides#dashboard'
end
Итак, ваша проблема limit routes for certain resources based on the enum user type
, Я предлагаю вам реализовать авторизацию вместо того, чтобы пытаться создавать больше ресурсов / областей на вашем маршруте, это правильно.