我只需要使用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::RecordNotFound
和raise CanCanCan::AccessDenied
,但这是一种解决方法。我希望CanCanCan可以处理授权部分。我可以在控制器中拉出记录并引发一个期望,但这与CanCanCan无关,对吗?
答案 0 :(得分:1)
我认为您的控制器中需要df['ma'] = df['voted'].rolling(5).mean()
。我认为这不会提高
load_and_authorize_resource
,除非您这样做。
raise CanCan::AccessDenied.new("Not authorized!", :read, Article)
只是将结果集的范围限定为您的能力文件中定义的结果