如何为“查看购买的领域”提供CanCan能力?

时间:2012-12-30 11:20:35

标签: ruby-on-rails devise cancan

我正在建立一个人们可以购买和购买的网站。在线观看视频。付费用户会看到视频,其他用户只看到描述&立即购买按钮。

有一个“订单”模型,“LineItems”指向视频。

我正在使用“视频”资源,与CanCan一起设计身份验证。购买视频的人有“客户”角色。

当用户完成付款时,订单的状态将更改为已完成。所以我需要一种方法来检查当前用户是否已购买视频,并显示它。虽然这可以在Controller中完成,但有没有办法在CanCan中完成?

1 个答案:

答案 0 :(得分:0)

这就是我解决它的方法:

在User模型中添加了“purchase_videos”方法,并附带以下代码。

def purchased_videos
  Video.joins(:line_items => {:order => :user}).where(:orders => {:user_id => self, :status => 'successful'})
end

在ability.rb中,添加了以下代码:

# Free videos can be watched by anyone
can :watch, Video do |video|
  video.price == 0 || user.purchased_videos.exists?(video.id)
end

现在我可以在视频视图中执行以下操作:

# Show video if user can watch it
render 'video_partial' if can?(:watch, @video)

# Show preview otherwise
render 'preview_partial' if cannot?(:watch, @video)