- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在处理一个 Rails 项目,不太了解 Rails 自动加载在我的特定情况下是如何工作的。我阅读了一些有关 Rails 的自动加载及其陷阱的文章,但这些文章并没有真正帮助我
我正在为任务(练习)构建一个处理器。每个任务在 Tasks::<TaskName>::Processor
中都有其自定义处理器类混合在模块中 Tasks::Processor
包含任务处理器的共享代码。处理器包含类 Get
(用于处理 GET 请求)位于 Tasks::<TaskName>::Processor::Get
混入 Tasks::Processor::Get
包含通用 Get
的代码。
我稍微简化了代码以便更容易理解并删除了所有业务逻辑,但它仍然足以重现问题。
所以问题是:
当我运行 Tasks::TaskOne::Processor.new.get
时它工作正常,但如果我运行 Tasks::TaskTwo::Processor.new.get
之后它会抛出一个错误:NoMethodError: undefined method `new' for Tasks::Processor::Get:Module。反之亦然:如果我先运行 TaskTwo 的处理器代码,那么它工作正常,但 TaskOne 的处理器将抛出错误。它只是找不到 Get 的具体实现,而是找到通用模块并尝试实例化它,这显然是不可能的。
这是代码和结构。
共享代码:
app/models/tasks/processor.rb:
module Tasks
# generic Processor (mixed in by custom processors)
module Processor
# ...
end
end
app/models/tasks/processor/get.rb:
module Tasks
module Processor
# generic Get
module Get
# ...
end
end
end
TaskOne的代码:
app/models/tasks/task_one/processor.rb:
module Tasks
module TaskOne
# processor for task_one
class Processor
include Tasks::Processor # mix in generic task processor
def get
Get.new.call
end
end
end
end
app/models/tasks/task_one/processor/get.rb:
module Tasks
module TaskOne
class Processor
# task_one's processor's custom Get
class Get
include Tasks::Processor::Get # mix in generic Get
def call
puts "in task_one's Processor's Get"
end
end
end
end
end
TaskTwo 的代码几乎相同:
app/models/tasks/task_two/processor.rb:
module Tasks
module TaskTwo
# processor for task_two
class Processor
include Tasks::Processor # mix in generic task processor
def get
Get.new.call
end
end
end
end
app/models/tasks/task_two/processor/get.rb:
module Tasks
module TaskTwo
class Processor
# task_two's processor's custom Get
class Get
include Tasks::Processor::Get # mix in generic Get
def call
puts "in task_two's Processor's Get"
end
end
end
end
end
这很可能与 Rails 的自动加载有关,因为当我使用纯 ruby 并手动要求所有文件并尝试运行代码时,问题并没有发生。你能解释一下为什么它会这样工作并告诉我避免这个问题的最好方法是什么吗?似乎 Rails 不喜欢我有一个同名的类和一个模块,这会让人感到困惑,但我认为这应该不是问题,因为它们位于不同的命名空间中。我本可以将通用类命名为不同的东西,但我真的很想了解为什么对特定实现和通用实现使用相同的类名只适用于第一个要加载的东西而不适用于下一个。非常感谢您的帮助!
附言我的 Ruby 版本是 2.5.1,Rails 版本是 5.2.1
最佳答案
我昨天确实在阅读有关自动加载的内容。您的问题与此处概述的问题相同:
https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#when-constants-aren-t-missed
基本上,无论何时编写 Get.new.call
,都需要更加具体。它不知道在可能的 Get
树中使用哪个 Get
。第一次调用它时,它不必加载多个 Get
类,因此它实际上找到了正确的类。在那个调用之后,你现在已经自动加载了更多的类,现在事情开始变得危险了。您需要使 Get
更具体,和/或使用 require_dependency
强制加载正确的类。但是考虑到您的情况,我认为 require_dependency
只会让它每次都失败,因为您现在已经加载了所有类。
关于ruby-on-rails - 在 Rails 项目中不断自动加载的问题(偶尔工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56308340/
我有 4 个 TextView。它们一开始都是不可见的,我将它们动画到屏幕上(从底部滑入)。我启动一个线程来为每个动画制作动画,每个动画开始时间间隔 200 毫秒。问题是:开始 Activity 后第
我有一个奇怪的问题,我似乎无法解决。 :(我有一个基于 Web 的应用程序,可以发送电子邮件。它通过连接在本地网络上设置的基于 Windows 的 SMTP 服务器来实现。此 SMTP 服务器不需要我
从昨天开始,我一直遇到一些设备收不到推送通知的问题。证书/设备 token 似乎是正确的,因为直到昨天,该设备还可以成功接收推送通知。 在服务器端,没有错误或连接拒绝,而且推送通知似乎每次都发送成功。
我有一个将 Angular 错误记录到数据库的应用程序,并且我偶尔会看到此错误的日志 Error: [$compile:tpload] http://errors.angularjs.org/1.5.
我收到一个 ImportError from azure.storage.blob import BlobServiceClient 但是我意识到当我安装依赖项时会发生错误 pip install a
我已经完成了使用AVAudioPlayer实现的简单音频播放GUI。 播放声音时,我使用UISlider提供播放反馈... 这是奇怪的地方。 我有一个非常偶尔发生的问题-而且大多数情况都不会发生,因此
在我的 XNA 游戏中,我的计算机(2.5 Ghz 双核 Intel Centrino 2)在 Debug模式下有一个大约需要 10 毫秒的操作。它只会每隔几分钟运行一次,它基本上只是整数数学/按位运
我相信我的应用程序编码正确(至少大部分是这样),因为它在大约 98% 的时间里都能正常工作。但是,大约 2% 的时间,我得到的似乎是有效的身份验证 token ,但是当我去发布照片时,我收到以下错误“
我在 apple store 上有一个应用程序,在 iOS6 更新后,我在 MKMapView 中收到了数百份崩溃报告。我无法在我的设备上重现崩溃。它看起来像是 EAGLContext 的问题。我们不
我最近开始使用 Foundation 5(我第一次使用 Foundation),我遇到了一个问题,似乎任何元素都响应了 .click 事件(例如顶部导航栏,单击元素时显示的数据下拉列表)将随机不起作用
花了大约一整天的时间试图解决这个问题,希望有人能帮助我!我是新来的,所以如果这是一个重复的问题,我深表歉意(我做了我的研究,但无法提前找到任何东西)。 我正在为我的咨询公司构建的网站使用浏览器缓存,但
我有一个表格,使用了以下 CSS 和 HTML: .price { position:relative; display:block; text-align:center; }
我们使用 ansible 将多个节点配置为一个集群。这些机器是在自定义 AWS 类似基础设施上创建的实例。 我们在不同的剧本上有大约一百个任务,它们在每个节点上执行。 问题是,我们收到零星的主机无法访
我们偶尔会从用户那里收到崩溃报告(我们使用崩溃报告程序包将崩溃发送到我们的服务器),并出现以下错误: “非法尝试在不同上下文中的对象之间建立关系‘...’” (不同的报表可能有不同的关系,并非所有报表
我是一名优秀的程序员,十分优秀!