-1

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

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

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

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

4

1 回答 1

0

这就是我解决它的方法:

向用户模型添加了“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)
于 2013-01-20T15:08:53.413 回答