我正在建立一个人们可以在线购买和观看视频的网站。付费用户会看到视频,其他用户只会看到描述和立即购买按钮。
有一个“订单”模型,其中“LineItems”指向视频。
我正在使用“视频”资源,与 CanCan 一起设计身份验证。购买视频的人具有“客户”角色。
用户完成支付后,订单状态变为已完成。所以我需要一种方法来检查当前用户是否购买了视频,并显示它。虽然这可以在 Controller 中完成,但有没有办法在 CanCan 中完成?
我正在建立一个人们可以在线购买和观看视频的网站。付费用户会看到视频,其他用户只会看到描述和立即购买按钮。
有一个“订单”模型,其中“LineItems”指向视频。
我正在使用“视频”资源,与 CanCan 一起设计身份验证。购买视频的人具有“客户”角色。
用户完成支付后,订单状态变为已完成。所以我需要一种方法来检查当前用户是否购买了视频,并显示它。虽然这可以在 Controller 中完成,但有没有办法在 CanCan 中完成?
这就是我解决它的方法:
向用户模型添加了“purchased_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)