【问题标题】:Devise, cancan, and namespace routes设计、cancan 和命名空间路由
【发布时间】:2011-10-13 23:04:28
【问题描述】:

我的路由器中有一个命名空间,如下所示:

namespace :my do
    resources :addressbookitems
end

controllers/my/addressbookitems_controller.rb 中,例如,我有indexshow 的操作。

我想根据命名空间以不同方式限制我的用户可以访问的资源:如果他们访问/addressbookitems,我想拥有不同的能力,然后使用/my/addressbookitems。我将如何构建我的能力课程?

【问题讨论】:

标签: ruby-on-rails devise cancan


【解决方案1】:

对于普通的 cancan,我认为唯一的选择是覆盖所有行为:

can do |action, subject_class, subject|
  # custom logic to allow or deny permission
end

他们在这里展示了一个例子:https://github.com/ryanb/cancan/wiki/Abilities-in-Database

另一个选项是使用cancan_namespace gem:https://github.com/galetahub/cancan_namespace

【讨论】:

  • 在 cancan 1.6.10 中,这不再是必需的。能力定义可以specify namespace
【解决方案2】:

如果我理解正确,那么您想在用户拥有此模型时提供编辑、删除等功能。如果是这样,那么您可以这样做:

can update, AddressBookItem, :user_id => user.id
can destroy, AddressBookItem, :user_id => user.id

如果你有更复杂的逻辑,那么:

can update, AddressBookItem do |item|
  item.user == user and item.state == :something
end

【讨论】:

  • 谢谢,这不是我想要的。相反,我正在为控制器寻找不同的能力逻辑,例如ReportController 和 My::ReportController,虽然它们共享模型。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2015-09-23
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多