Rails cancancan获取特定用户的记录

时间:2019-06-05 00:26:43

标签: ruby-on-rails cancancan

我只需要使用CanCanCan在特定条件下从数据库中获取特定记录。这是我的数据模型。

class User < ApplicationRecord
  has_many :regions_users
end

class RegionsUser < ApplicationRecord
  belongs_to :region
end

class Region < ApplicationRecord
  has_many :regions_users
  has_many :sites
end

class Site < ApplicationRecord
  belongs_to :region
  has_many :offers
end

class Offer < ApplicationRecord
  belongs_to :site
end

例如,一个用户被分配到两个区域,这意味着该用户 user.regions_users返回两个RegionsUser [RegionsUser1,RegionsUser2]的数组。 RegionsUser1属于Region A,RegionsUser2属于Region B,因此,如果我以用户身份登录,则我是可以监视属于那些区域的数据的区域用户。现在,我需要显示属于那些区域(区域A和区域B)的商品。这意味着,用户无法访问属于区域A和区域B以外的区域的商品,因此访问/offers/3会引发Access Denied错误。

我可以从RegionsUser中拉出区域:

region_ids = user.regions_users.pluck(:regions_id)

然后是要约:

Offer.joins(:site).where(sites: { region_id: region_ids })

我了解了使用here

描述的功能块来定义能力
can :update, Project, ["priority < ?", 3] do |project|
  project.priority < 3
end

但我想不出任何解决方案。我将不胜感激。

UPDATE

这有点用,但是它不会显示“访问被拒绝”页面,而是引发“ 404页面未找到”错误。

offers_controller.rb

def offer
  @offer ||= Offer.accessible_by(current_ability).find(params[:id])
end

ability.rb

if user.region_user?
  region_ids = user.regions_users.pluck(:region_id)
  can :read, Offer, site: { region_id: region_ids }
end

更新2

我可以抓住ActiveRecord::RecordNotFoundraise CanCanCan::AccessDenied,但这是一种解决方法。我希望CanCanCan可以处理授权部分。我可以在控制器中拉出记录并引发一个期望,但这与CanCanCan无关,对吗?

1 个答案:

答案 0 :(得分:1)

我认为您的控制器中需要df['ma'] = df['voted'].rolling(5).mean() 。我认为这不会提高

load_and_authorize_resource,除非您这样做。 raise CanCan::AccessDenied.new("Not authorized!", :read, Article)只是将结果集的范围限定为您的能力文件中定义的结果