具有枚举用户角色的Rails路由

时间:2019-02-07 01:08:35

标签: ruby-on-rails devise rails-routing

我创建了一个users表并实现了Devise。然后,我在用户表中添加了一个枚举角色,以便可以标识管理员,指南和成员。

我想做的是根据枚举用户类型限制某些资源的路由。我尝试过:

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

无论出于何种原因,引导个人资料的显示/编辑效果都很好;仪表板工作正常;但是authenticate块之外的其他内容(入门和位置资源)不起作用,我被重定向到Devise登录页面。它们位于身份验证块的外部(在上面的一种情况下),不确定为什么某些资源/路由而不是其他资源/路由会发生这种情况。

2 个答案:

答案 0 :(得分:1)

您可以使用设计助手。使用authenticate,可以制作在访问之前要求进行身份验证的资源和路由。如果未通过验证,则用authenticate替换authenticated会导致资源不可用。这两个助手都具有可选的作用域和块,以提供对模型实例本身的约束。

authenticate :user, ->(u) { u.guide? } do
  get 'guide/dashboard', :to => 'guides#dashboard'
end

答案 1 :(得分:0)

因此,您的问题是limit routes for certain resources based on the enum user type。我建议您应该实施授权之类的东西,而不是尝试在路由中创建更多的资源/范围,这是正确的。