【问题标题】:Overriding class method in ruby not working as expected在ruby中覆盖类方法没有按预期工作
【发布时间】:2012-11-22 13:04:37
【问题描述】:

我有一个基本控制器来干燥我的许多沼泽标准 crud 控制器,我的想法是只有在我需要做一些非标准的事情时才覆盖每个方法。

class MyBaseController < ApplicationController

  load_and_authorize_resource

  # Common crud actions

end

现在在我的一个子控制器中,我有一个自定义操作 (export_csv)

class ReportsController < MyBaseController 

  load_and_authorize_resource :except => :export_csv

  def export_csv
    # custom auth and other stuff
  end

end

现在我无法再点击 export_csv 操作,而是收到拒绝访问异常。如果我不从我的基本控制器继承一切都很好。

我认为我可以按如下方式解决它:

class MyBaseController < ApplicationController

  load_and_authorize_resource :except => auth_exceptions

  def self.auth_exceptions
    []
  end

  # Common crud actions

end

然后根据需要覆盖我的子类中的 self.auth_exceptions。

但是这会触发错误“MyBaseController:Class 的未定义局部变量或方法 `auth_exceptions'”

有没有人有任何建议可以选择性地覆盖我的子控制器中的加载和授权资源?

感谢您的帮助。

【问题讨论】:

  • 我认为这完全是个坏主意:一些控制器不能代表任何资源,您必须修补所有内容。
  • 在这些情况下,我可以直接从 ApplicationController 继承?
  • 是的,取决于您的期望。希望你不要过度干燥的事情,这会导致昂贵的未来变化
  • 我正在根据 codeclimate.com 的反馈进行这些更改,我的许多 crud 操作与生成的脚手架没有太大变化,因此它突出显示了我的许多控制器重复的代码...
  • CodeClimate 提供了宝贵的提示,这很确定。但是你只能从整体上理解你的应用,做你认为最好的事情,我只是希望你手头有所有的牌

标签: ruby-on-rails ruby ruby-on-rails-3 oop cancan


【解决方案1】:

在您的派生类中尝试:

skip_load_and_authorize_resource :only => :export_csv

文档在这里:skip_load_and_authorize_resource

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2021-03-29
    • 2015-10-07
    • 2013-09-21
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多