gpt4 book ai didi

Ruby 继承和要求顺序

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:40 25 4
gpt4 key购买 nike

我正在尝试设置一个新的模块化 Sinatra 应用程序。这是相关的文件夹结构:

- app 
- controllers
- application_controller.rb
- website_controller.rb
- config.ru

application_controller.rb 定义了 ApplicationController 类,需要 sinatra/base,除此之外,没有做任何有趣的事情。

website_controller.rb继承了application_controller.rb:

# website_controller.rb
class WebsiteController < ApplicationController

include Sinatra::Cookies
...
end

我的 config.ru 文件是我运行以启动 Sinatra 应用程序的文件,因此它应该需要所有类:

#config.ru
require 'sinatra/base'

Dir.glob('./app/{models,helpers,controllers}/*.rb').each {|file|
require file
}

...

当它需要所有文件时,它在需要 application_controller.rb 之前需要 website_controller.rb。这样,当解析 WebsiteController 上的继承时,它还不知道 ApplicationController 是什么,我得到错误 uninitialized constant ApplicationController (NameError).

设置我的项目的最佳做法是什么,这样我就可以准备好所有必需的文件,而不会遇到这种排序问题?

最佳答案

因此,另一个答案实际上是正确且最简单的方法 - 但如果出于某种原因您不想那样做,您可以使用 autoload ,前提是您已经开发了 Sinatra “模块化”风格的应用程序。

config.ru 中,您当前正在“急切加载”所有文件。相反,您将显式列出未知常量的加载路径 - 如下所示:

autoload :ApplicationController, 'app/controllers/application_controller'
autoload :WebsiteController, 'app/controllers/website_controller'

请注意,autoloadModule 上的一个方法,因此您必须将对 autoload 的调用放在同一个“命名空间”中 - 即:

module MyApp
autoload :MyThing, 'models/my_thing'
end

当缺少常量 MyApp::MyThing 时将触发自动加载。也就是说 - 除非您知道为什么您需要自动加载您的类,只需在文件顶部要求它。

关于Ruby 继承和要求顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34048011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com