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