使模块中的所有类在模块中随处可用

时间:2015-09-16 16:25:56

标签: ruby github module gem

我正在编写用于管理Github问题的控制台实用程序,但我遇到了undefined method错误。

我的应用程序采用以下方式构建

gissues.rb # includes all files in subfolders

Gissues
    github.rb #Gissues::Github general github stuff

    commands.rb #Gissues::commands subclass of Thor (whatisthor.com), general command stuff

    cli.rb #subclass of commands, lists command shortcuts and subcommands

    commands

        user.rb #Command::User subclass of Gissues::Commands holds logic for github user related commands like signin, signout, whoami

    github

        user.rb #Github::User subclass of Gissues::Github holds logic for communicating with github for authentication (checking credentials)

我定义了在github文件夹中的user.rb中与Github通信的方法。我想在命令文件夹中定义的user.rb中使用这些方法,但是当我这样做时,它似乎超出了范围,我得到了一个未定义错误的方法。

user.rb(命令)看起来像这样

module Gissues
    class Command::User < Gissues::Command
        desc "signin", "Starts loging sequence"
        def signin
            Gissues::Github::User::request_token
        end
     end
end

我收到以下错误

/Users/someone/RubymineProjects/Gissues/lib/gissues/commands/user.rb:9:in `signin': undefined method `request_token' for Gissues::Github::User:Class (NoMethodError)

我做错了什么? 提前致谢

编辑:This image may make the structure more clear此图片可能会使结构更清晰

1 个答案:

答案 0 :(得分:0)

如果您的顶级模块对所有子模块都有明确的require,那么这不会成为问题。如果您直接加载底层模块,则不会真正定义任何其他模块。那就是问题出现的地方。

典型模块如下:

module Gissues
  require 'gissues/command'
  require 'gissues/user'
end

这些需要按依赖顺序列出。尽管不推荐,但可以使用autoload来完成相同的任务。

只要它们按照正确的顺序加载,你就应该好好去。

值得注意的是,方法应该在方法之前用点Gissues::Github::User.request_token调用。 ::表示法通常保留用于类名或常量,例如Gissues::CONSTGissues.method_name