Rails模块作为严格的命名空间

时间:2018-07-02 08:40:27

标签: ruby-on-rails ruby-on-rails-4 module namespaces

我对Rails很陌生,我对模块如何在这里工作有点困惑。我有一个这样的项目结构:

GLFWwindow * win = glfwCreateWindow(tile_w*cols, tile_h*rows, ss.str().c_str(), 0, 0);
glfwSetWindowUserPointer(win, &dev);

glfwSetKeyCallback(win, [](GLFWwindow * win, int key, int scancode, int action, int mods)
{
    auto dev = reinterpret_cast<rs::device *>(glfwGetWindowUserPointer(win));
    if (action != GLFW_RELEASE) switch (key)
    {
    case GLFW_KEY_R: color_rectification_enabled = !color_rectification_enabled; break;
    case GLFW_KEY_C: align_color_to_depth = !align_color_to_depth; break;
    case GLFW_KEY_D: align_depth_to_color = !align_depth_to_color; break;
    case GLFW_KEY_E:            
        if (dev->supports_option(rs::option::r200_emitter_enabled))
    {
        int value = !dev->get_option(rs::option::r200_emitter_enabled);
        std::cout << "Setting emitter to " << value << std::endl;
        dev->set_option(rs::option::r200_emitter_enabled, value);
    }
                                break;
    case GLFW_KEY_A:
        if (dev->supports_option(rs::option::r200_lr_auto_exposure_enabled))
        {
            int value = !dev->get_option(rs::option::r200_lr_auto_exposure_enabled);
            std::cout << "Setting auto exposure to " << value << std::endl;
            dev->set_option(rs::option::r200_lr_auto_exposure_enabled, value);
        }
        break;
    }

});

之前我曾经使用过许多编码语言,我希望可以很容易地在Bar和ExternalService中使用'Foo',就像那样,但是

  

LoadError:无法自动加载常量Foo,需要lib / external_service / foo.rb对其进行定义

ExternalService :: Foo通常甚至在ExternalService外部也不可见,但整个项目都死于此事

我是否只是缺少一种“严格模式”符号或其他任何内容,以确保我明确地表示服务内部的ExternalService :: Foo并防止该服务杀死我的模型?

我知道我可以在模块前面添加,但是我想保持代码可读。 如果有人可以在这种情况下帮助我,那就太好了:)

谢谢

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

所以您正在使用导轨4

如果要创建模块,首先需要导入或自动加载lib文件夹

例如在 application.rb 中,您可以将lib文件夹添加到自动加载中:

import 'package:dio/dio.dart';
Dio dio = new Dio();
Response response=await dio.get("https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=40.6655101,-73.89188969999998&destinations=40.6905615%2C,-73.9976592&key=YOUR_API_KEY");
print(response.data);

在那之后,因为您使用的是Rails,所以您应该使用文件夹大小写的模块层次结构名称创建一个文件夹层次结构 例如,如果您有:

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

您的foo.rb文件应位于名称为“ external_service”的文件夹中

module ExternalService
  class Foo
    ...
  end
end

文件夹层次结构是rails的约定。

答案 2 :(得分:0)

回答我自己的问题.. Ruby的行为就是这样,这完全可以。

在这种情况下,已经加载了Foo-Model,因此ruby更喜欢这种方式,而不是本地的。同样按字母顺序排列的app /在lib /

之前

一个不太漂亮但快速解决的方法就是这样称呼它: attribute :foo, ExternalService::Foo