ruby-on-rails - 康康舞能力在单独的文件中

标签 ruby-on-rails ruby cancan

是否可以在单独的文件中定义能力并将其包含在初始化方法内的ability.rb文件中?

下面的代码返回:尝试并得到:未定义的方法'can'

能力.rb

def initialize(user)
  include MyExtension::Something::CustomAbilities
  ...
end

lib/my_extension/something.rb

module MyExtension::Something

  module CustomAbilities
      can :do_it, Project do |project|
      check_something_here and return true or false...
    end
  end

end

完美的解决方案,如果可能的话,是使用Ability.send :include/extend扩展类Ability,这样就无需在初始化方法中显式包含

最佳答案

只需包含模块并在initialize中调用方法

这里的技巧是为您的每项能力创建模块,将它们包含在您的基本 ability.rb 文件中,然后在您的 initialize 方法中运行特定方法,像这样:

在您的ability.rb文件中:

class Ability

  include CanCan::Ability

  include ProjectAbilities 

  def initialize user
    # Your "base" abilities are defined here.

    project_abilities user
  end  

end

在您的lib/project_ability.rb文件中:

module ProjectAbilities

  def project_abilities user
    # New abilities go here and later get added to the initialize method
    # of the base Ability class.

    can :read, Project do |project|
      user.can? :read, project.client || user.is_an_admin?
    end 
  end

end

使用此模式,您可以将您的能力分解为各种模块(也许,您必须为其定义用户能力的每个模型都有一个模块)。

看看Pundit

另外值得注意的是,看看(相对)新的 gem,名为 Pundit ,它为大型网站的授权提供了一种更具可扩展性的模式。

干杯,

日本

关于ruby-on-rails - 康康舞能力在单独的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7738376/

相关文章:

ruby-on-rails - 在 Rails 上部署 Neo4j

html - 避免在 HTML 中呈现注释

ruby - 字符串连接错误

ruby-on-rails - Ajax 发布点击 Action ,无需使用 CanCan 和 Devise 进行身份验证

ruby-on-rails - 如何通过OAuth身份验证传递参数,以便回调或 Controller 可以使用?

javascript - 根据 AJAX 请求替换整个页面标记

ruby - Rails 3- Active_admin 和 CanCan 集成

ruby-on-rails-3 - Rspec、CanCan 和 Devise

ruby-on-rails - 带有年龄的 Rails 日期验证

ruby - 当我的脚本中断时,如何让 shell/ruby 发出声音(让我的电脑发出哔哔声或播放声音/音轨)?