【问题标题】:Calling a module's methods on a Gem's object?在 Gem 的对象上调用模块的方法?
【发布时间】:2014-12-03 19:12:40
【问题描述】:

我已经通过 ruby​​ gem (Koala) 生成了一个对象,并且我已经编写了一些带有辅助方法的模块。为了能够在对象的模块中使用方法,我需要做什么?

如果我,model_object = Model.new,model_object 将有权访问所有实例变量,但 object 没有(见下文)。

Ruby 2.1、Rails 4.1

config/application.rb - 在文件夹中自动加载模块

config.autoload_paths << Rails.root.join('lib/module_folder')

型号

class Model < ActiveRecord::Base
   include Module
   include Module::Module2
   include Module::Module3

   def self.create_account(token)
      object = Module.module_class_method(token) #this works and generates the Koala object
      ERROR: object.module2_instance_method # Error: NoMethodError Exception: undefined method
   end
 end

模块

module Module
   extend ActiveSupport::Concern
end

模块2

module Module
    module Module2
        def module2_instance_method
        end
    end
end

解决了我自己 - 问题是包含语句在类中,如果我将它们移到外面它工作。

【问题讨论】:

  • 向我们展示您的尝试,以便我们提供帮助(即向我们展示代码)。
  • 抱歉,添加了代码。

标签: ruby-on-rails ruby ruby-on-rails-4 koala


【解决方案1】:

我相信如果您将模块包含在 app/ 目录下的某个位置 - 它们会自动包含在内。否则,您实际上必须使用 require 语句在您的 Rails 代码中明确要求它们

【讨论】:

  • 我已经要求并将它们包含在调用它们的模型中,但出现错误:NoMethodError Exception: undefined method
【解决方案2】:

在没有看到实际代码的情况下,我认为您的代码 sn-p 中 Module2 的问题是 self. 方法。

因为您在object 的一个实例上调用module2_instance_method,所以模块中的方法不能有self.,因为它指定了一个类方法,因此必须以Module::Module2.module2_instance_but_not_really_because_I_am_a_class_method 调用.

我相信如果您将def self.module2_instance_method ... end 更改为def module2_instance_method ... end,您应该不会再收到NoMethodError 异常。

如果我误读或误解了 OP,我们深表歉意。

【讨论】:

    【解决方案3】:

    将包含语句从内部移到类声明上方,所有方法都开始工作。我的假设是,当它们在语句中时,它们仅适用于该类的对象。

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 2020-08-01
      • 2016-04-20
      • 2016-09-01
      相关资源
      最近更新 更多