Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3.2 如何将命名范围(或其他声明)添加到已安装gem(例如我们的Forem gem)的模型中?_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails 3.2 如何将命名范围(或其他声明)添加到已安装gem(例如我们的Forem gem)的模型中?

Ruby on rails 3.2 如何将命名范围(或其他声明)添加到已安装gem(例如我们的Forem gem)的模型中?,ruby-on-rails-3.2,Ruby On Rails 3.2,环境 ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin10.8.0];轨道3.2.6;OSX 10.6.8;设计(2.0.4)领班红地毯(1.0.0) 目标 我们需要在Forem安装(gem)中部署额外的订单控制。很可能,我们还需要声明更多的模型属性;我们可以这样做: 将命名范围添加到基础Forem模型中 或者通过覆盖基础模型 问题 我们该怎么做呢?好吧……我建议1。(无可否认,因为我确实对此有答案;-) 将其放入自动加载路径: 扩展它.rb: r

环境

ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin10.8.0];轨道3.2.6;OSX 10.6.8;设计(2.0.4)领班红地毯(1.0.0)

目标

我们需要在Forem安装(gem)中部署额外的订单控制。很可能,我们还需要声明更多的模型属性;我们可以这样做:

  • 将命名范围添加到基础Forem模型中
  • 或者通过覆盖基础模型
  • 问题

    我们该怎么做呢?

    好吧……我建议1。(无可否认,因为我确实对此有答案;-)

    将其放入自动加载路径:

    扩展它.rb

    require 'active_support/concern'
    
    module ExtendIt
      extend ActiveSupport::Concern
    
      included do
        scope :extension_scope, where(:name => "Mr. X")
      end
    
      module ClassMethods
      end
    end      
    
    AnyClass.send :include, ExtendIt
    
    在初始值设定项中是这样的:

    扩展它.rb

    require 'active_support/concern'
    
    module ExtendIt
      extend ActiveSupport::Concern
    
      included do
        scope :extension_scope, where(:name => "Mr. X")
      end
    
      module ClassMethods
      end
    end      
    
    AnyClass.send :include, ExtendIt
    

    当然,
    AnyClass
    是您的目标类之一。更多的阅读可以在这里找到:

    答案――如何解释装饰师的异常执行

    一位同事将我的要求指向现有的工头文件(),该文件将很好地回答这个问题,除了以下极有可能的例外情况:

    直到现在我还没有回应的一个原因是,尝试遵循推荐的模式最初并没有成功,因为一些底层代码(少数异常)引用了模型类,而没有将它们放在属于Forem引擎的前面。因此,一开始,这条路线似乎根本不起作用;而且,(我仍然不确定所有的结果是什么),因此,似乎有必要用修改后的引用覆盖基础方法(在引用之前没有使用“Forem::”),形式为“Forem::ModelName”(与“ModelName”相反)

    正如Github的Forem文档页面所示:

    “Forem的所有业务逻辑(模型、控制器、助手等)都可以使用标准Ruby习惯用法轻松地进行扩展/重写,以满足您的确切需求

    在应用程序或扩展中包含此类更改的标准做法是创建一个目录app/decorators。
    将文件放在相关的app/decorators/modelsapp/decorators/controllers目录中,并将\u decorator附加到原始类名中。”

    换句话说,要在控制器进程中分配更多的接口值,您必须向相应的目录添加一个decorator,Ruby将从中查找并覆盖底层进程:

    作为/Forem/app/控制器居住的原始Forem源的控制器/Forem/admin/groups\u controller.rb,因此被/your\u project\u name/app/decorators/Forem/admin/groups\u controller\u decorator.rb覆盖

    在下面的代码片段中(从这个文件中),您经常调用“index_original”,将原始index方法别名为“index_original”:

    但是,这不起作用,因为工头控制员的基本索引方法进行了以下分配:

    @groups = Group.all
    
    def index
        @h_title_of_page = t('h_title2_forum_admin_groups_index')
        @h_description2 = t('h_description2_forums')
    
        # index_original
            @groups = Forem::Group.all # @groups = Group.all ERROR 
        end
    
    因此,当您在decorator中调用index_original时,对“Group.all”的调用会出现一个错误,这显然是因为不加前缀就无法识别祖先,因为它属于Forem模块:

    @groups = Forem::Group.all
    
    因此,要在您的装饰器中解决此问题,您必须采取以下方法(注释掉#index_original以指示必须替换它的内容):

    @groups = Group.all
    
    def index
        @h_title_of_page = t('h_title2_forum_admin_groups_index')
        @h_description2 = t('h_description2_forums')
    
        # index_original
            @groups = Forem::Group.all # @groups = Group.all ERROR 
        end
    
    注意,语句“@groups=Forem::Group.all”是祖先索引方法的唯一语句;因此,将固定语句引入decorator就是将整个方法代码引入到您自己的decorator中。这修复了异常执行,只是因为对祖先索引方法的完全重写本身就足以消除对Forem:未前置的模型的任何进一步调用如果对底层类的任何进一步调用都没有前置,那么这些方法同样必须被带到您的decorator中。

    因此,为了解释您自己(依赖)项目中的每一个潜在异常,您必须从Github下载Forem源代码,并研究您必须别名的基础方法是否引用了它们自己的模型,并在它们前面加上/不加上“Forem::”:

  • 如果您正在调用的Forem流程调用的所有调用模型都是前置的,那么我的努力表明您可以将调用别名为原始方法(例如,作为index_original)
  • 但是,另一方面,如果在流程中对Forem模型的任何底层调用,您的装饰器调用都没有以“Forem::”开头,我的努力表明您必须将底层方法的所有代码都拉入装饰器(如上所述)。

  • 希望将来Ruby能够识别出这样的引用,并且/或者Forem的作者会为他们的内部引用做序(即使代码在Forem开发环境中运行得很好)。

    非常感谢您的回答和努力。这可能确实有效,但我没有尝试您的解决方案,因为一位同事建议我查看Forem文档,该文档提倡的模式似乎更接近于覆盖/子类化祖先类的OOP模式。我已经向GitHub的Forem作者报告了这个问题。尽管如此,答案仍然适用于覆盖任何已安装gem/引擎的功能。