在我使用CanCan的应用程序中,我有权限,用户可以查看和创建商店,但我也希望他们只能编辑他们创建的商店。用户可以根据自己的喜好创建任意数量的商店,这些商店都应该可以编辑。商店没有用户,所以当他们user_id
表之间没有Store
时,我怎么能这样做?
惭惭:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role == "default"
can :read, Store
can :create, Store
end
end
end
答案 0 :(得分:3)
由于用户可以根据自己的喜好创建任意数量的商店,因此商店将属于用户。
你必须创造这种关系。
所以,在User
模型中。
class User < ActiveRecord::Base
has_many :stores
end
在Store
模型中。
class Store < ActiveRecord::Base
belongs_to :user
end
在ability.rb
文件中,只需添加以下内容:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role == 'default'
can :manage, Store , :user_id => user.id
end
end
end
答案 1 :(得分:1)
我会将以下内容添加到商店模型中:
has_one :created_by, :class => User
然后添加迁移以将created_by_id添加到Store类。
然后你应该能够添加一个CanCan :: Ability:
can :edit, Store, :created_by => user
答案 2 :(得分:1)
我同意之前的海报,您必须在User
和Store
之间建立关系。如果商店可以有多个用户,这种关系可以是一对多(如Kleber S.所示),也可以是多对多关系。
然后,处理访问控制的最佳方法是在控制器中使用关联。对于show
,edit
,update
,destroy
方法,您需要在已登录用户的情况下找到商店,所以请执行以下操作:
class StoresController < ApplicationController
before_filter :find_store, only: [:show, :edit, :update, :destroy]
def show
end
def edit
end
def update
if @store.update_attributes(params[:store])
# redirect to show
else
# re-render edit, now with errors
end
end
# ...
private
def find_store
@store = current_user.stores.find(params[:id])
end
end
这样,关联就会将查找限制为仅通过外键连接到current_user
的那些商店。这是RESTful Rails资源执行相关资源访问控制的标准方法。