我创建了一个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登录页面。它们位于身份验证块的外部(在上面的一种情况下),不确定为什么某些资源/路由而不是其他资源/路由会发生这种情况。
答案 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
。我建议您应该实施授权之类的东西,而不是尝试在路由中创建更多的资源/范围,这是正确的。