【问题标题】:cancancan manage a relationship Railscancancan 管理关系 Rails
【发布时间】:2016-09-16 00:25:53
【问题描述】:

我在使用 cancancan gem for rails 时遇到了问题

gem 'cancancan', '~> 1.10'

我有四个模型:用户、公司、位置、组

用户:属于公司 公司:有很多地方 地点:公司所属 组:属于位置

在能力模型中我有这个:

can :manage, Group, :location => {:id => user.company.locations.map{|l| l.id}}

创建新组时我被拒绝(无权访问)

我正在寻找允许用户使用公司位置 ID 之一创建组的正确方法(注意:如果没有 cancancan,这一切正常,所有 ID 都是相关的,依此类推)。

【问题讨论】:

    标签: ruby-on-rails ruby cancancan


    【解决方案1】:

    为了确保我完全理解你的问题......

    您正在寻找一种方法来根据用户所属公司的位置来限制用户管理群组的能力?

    假设我猜对了,我建议使用#pluck

    can :manage, Group, location_id: user.company.locations.pluck(:id)
    

    这会收集用户公司位置上的所有:id,并确保用户只能管理该集合中包含 :location_id 的组。

    从功能上讲,这与您所做的相同,但在两个方面更有效:

    1. 不涉及任何不必要的 Ruby 逻辑

    2. 使用#pluck 仅查询某个位置的:id,而不是整个位置它的所有属性

    一般来说,每当您在 Rails 中访问数据库时,最好完全使用 ActiveRecord 方法。这将有助于防止您浪费时间查询不需要的额外信息,并消除使用 Ruby 重构数据的额外开销。

    希望有帮助!

    【讨论】:

    • 谢谢!您对使用 pluck 的建议正是我想要的!但是我仍然无法创建组。尝试创建时,它显示我无权访问该资源。
    • 嗯...只是为了仔细检查,您正在尝试为属于您的用户帐户所属公司的位置创建一个组,对吗?因为如果 cancancan 设置正确,则只有在您公司的位置集合中存在 location_id 时,您才能创建一个组。如果您尝试创建的群组没有必需的 location_id,它应该拒绝您。
    • 正确,我在下面包含了更多详细信息: def group_params params.require(:group).permit(:name, :location_id) end 创建方法:@group.create(group_params).save 发送的参数在开发日志中:"group"=>{"name"=>"Test"}, "button"=>"", "location_id"=>"1"}
    • 这对我来说很难在没有看到您项目的其余部分的情况下进行故障排除。您是否验证了用户上的company_id 和id = 1 的位置上的company_id 相同?如果他们,那么我不知道从这里去哪里。
    • 是的,我只有一个用户一个公司和一个位置。所以所有的 ID 都很好......我不知道发生了什么!
    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多