我使用devise
,到目前为止,我只添加了devise
个控制器以及三个用户(user1,user2,admin)的视图。我在任何控制器中都没有before_action :authenticate_user!
。基本上this是我到目前为止所做的
因此,目前所有注册用户都可以登录和查看/编辑所有内容。此时我想限制每个用户只查看或编辑他的内容。
这基本上就是我所追求的:管理员可以访问所有应用。 User1将有权访问get 'books/search' => 'books#search', as: 'search_books'
,从而root 'books#search'
。 User2可以通过`resources:books添加/删除/编辑一本书,也可以查看他当前的帐户。
不确定我应该为resources :plans, resources :accounts, resources :transactions
提供哪些访问权限。计划是为了购买计划,以及交易和帐户属于user2。你可以看到下面的关联。
我对此进行了一些研究,发现了一些gems
,CanCan
,rolify
,它们为用户添加了角色。
我是否可以通过devise
实现角色的其他方式?
Rails.application.routes.draw do
root 'books#search'
get 'books/search' => 'books#search', as: 'search_books'
get "/cancel_subscription", to: "accounts#cancel_subscription", as: "cancel_subscription"
devise_for :admins, controllers: {registrations: 'admins/registrations', sessions: 'admins/sessions'}, :class_name => 'Admin' do
get "admins/dashboard"=> "admins/sessions#dashboard", :as => "admin_dashboard"
end
devise_for :users1, controllers: {registrations: 'users1/registrations', sessions: 'users2/sessions'}
devise_for :users2, controllers: {registrations: 'users2/registrations', sessions: 'users2/sessions'}
resources :books do
resources :comments
end
resources :categories
resources :plans
resources :accounts
resources :transactions, only: [:new, :index, :create]
end
class Comment < ApplicationRecord
belongs_to :book
belongs_to :user1
end
class Books < ApplicationRecord
has_many :comments
end
class User1 < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :comments
end
class User2 < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :account, autosave: true
has_many :books
accepts_nested_attributes_for :account
end
class Admin < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
答案 0 :(得分:0)
您可以做的是使用
检查当前班级的类型 if current_user.class.eql?(class_name_of_user)
#perform some action
end
您可以通过在控制器中将其设置为私有方法并通过before_action回调来调用它来优化它。