【问题标题】:How to provide CanCan ability for "view purchased field"?如何为“查看已购买字段”提供 CanCan 能力?
【发布时间】:2012-12-30 11:20:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这个问题太笼统了,我认为堆栈溢出的人无法为您提供帮助。
  • 添加了更多细节。我希望这些细节足以提供答案(或告诉它不可能)。
  • 这更像是一个可以在这里得到答案的问题,但我无法帮助你,因为我不熟悉这些插件。另外,我还没有完全理解这个问题。

标签: ruby-on-rails devise cancan


【解决方案1】:

我就是这样解决的:

在 User 模型中添加了“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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多