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, Я предлагаю вам реализовать авторизацию вместо того, чтобы пытаться создавать больше ресурсов / областей на вашем маршруте, это правильно.

Другие вопросы по тегам