Rails:允许用户仅查看或编辑自己的内容

时间:2017-10-03 08:27:35

标签: ruby-on-rails ruby devise cancan rolify

我使用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。你可以看到下面的关联。

我对此进行了一些研究,发现了一些gemsCanCanrolify,它们为用户添加了角色。

我是否可以通过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

1 个答案:

答案 0 :(得分:0)

您可以做的是使用

检查当前班级的类型

if current_user.class.eql?(class_name_of_user) #perform some action end 您可以通过在控制器中将其设置为私有方法并通过before_action回调来调用它来优化它。